トップページunix
1001コメント285KB

シェルスクリプト総合 その2

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2005/04/17(日) 00:17:17
シェルスクリプトの総合スレです。スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。

□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0005名無しさん@お腹いっぱい。2005/04/17(日) 00:21:44
では、引き続きマターリと逝きましょう。
0006名無しさん@お腹いっぱい。2005/04/17(日) 00:39:49
>>1
0007名無しさん@お腹いっぱい。2005/04/17(日) 03:42:00
乙。でも見辛いような気がする。
お約束は>>1に置いといた方がよかったんでは。
次スレのテンプレは前スレ準拠がいいな。
0008名無しさん@お腹いっぱい。2005/04/17(日) 10:55:18
8ビット文字を¥xFFとか指定してファイル名に使いたいです
どうしますか?
0009名無しさん@お腹いっぱい。2005/04/17(日) 10:58:11
bashを使って、
echo -e "\xFF"
で混ぜる。
0010名無しさん@お腹いっぱい。2005/04/17(日) 10:59:44
touch $'\xa4\xb5\xa4\xe6\xa4\xdf\xa4\xf3\xa4\xab\xa4\xef\xa4\xa4\xa4\xa4\xa4\xe8\xa4\xb5\xa4\xe6\xa4\xdf\xa4\xf3'
0011名無しさん@お腹いっぱい。2005/04/17(日) 11:19:12
touch: ゆみさんかわいいよゆみさん: Invalid argument
0012名無しさん@お腹いっぱい。2005/04/17(日) 12:12:49
http://pc8.2ch.net/test/read.cgi/unix/1107342206/168
0013名無しさん@お腹いっぱい。2005/04/17(日) 13:14:53
echo, printならできるが他はダメポだな
0014名無しさん@お腹いっぱい。2005/04/18(月) 21:29:39
ん?できますよ??

> touch ゆみさんかわいいよゆみさん
> ls
ゆみさんかわいいよゆみさん
> touch ゆみさんかわいいよゆみさ
> touch ゆみさんかわいいよゆみ
> touch ゆみさんかわいいよゆ
> touch ゆみさんかわいいよ
> ls
ゆみさんかわいいよ ゆみさんかわいいよゆみさ
ゆみさんかわいいよゆ ゆみさんかわいいよゆみさん
ゆみさんかわいいよゆみ
> rm ゆみさん*
> ls
0015名無しさん@お腹いっぱい。2005/04/18(月) 21:45:40
touch ゆみさんかわいいよゆみさん
はできるけど$'......'の形式がダメ
0016名無しさん@お腹いっぱい。2005/04/18(月) 21:49:54
ゆみさんがかわいくないんじゃなかろうか
0017名無しさん@お腹いっぱい。2005/04/18(月) 22:20:50
ぎゃふん
0018名無しさん@お腹いっぱい。2005/04/18(月) 23:35:03
cronなどに登録して使う、特定のコマンドが終了していたら再起動するスクリプトが欲しいです。
最初に起動したコマンドのプロセス番号を記録しておけばいいんでしょうか。
一度には一つしか使わないので、psコマンドの出力を適当にgrepして使ってもいいでしょうか。

お知恵をお貸しください。しばらく自分で考えてみます。
0019名無しさん@お腹いっぱい。2005/04/18(月) 23:37:21
daemontools使ったほうが早い。
0020名無しさん@お腹いっぱい。2005/04/18(月) 23:37:53
inittabでactionにrespawn
0021名無しさん@お腹いっぱい。2005/04/18(月) 23:38:23
daemontoolsはDebianの専売特許かと思ってましたが…。
そんなにいいならちょっと見てみますね。
0022212005/04/18(月) 23:39:52
ってか最初にMac OS Xだと言わなかったのはうかつでした。ごめんなさい。
0023212005/04/18(月) 23:41:45
連投すみません。
ついでに言いますと、root権限がない場合のことも考えておきたいところなんです。
0024名無しさん@お腹いっぱい。2005/04/18(月) 23:42:37
すみませんが
シェルスクリプトでatofに相当するコマンドと使用法を教えてください
0025212005/04/18(月) 23:44:31
>>24 型とかないし、そのまま計算に使わないの…?
0026名無しさん@お腹いっぱい。2005/04/18(月) 23:47:05
daemon 監視して落ちてたらroot権限なしで再起動?
一般ユーザでってこと?特別な管理専用ユーザつくるってこと?
0027名無しさん@お腹いっぱい。2005/04/18(月) 23:49:46
一般ユーザです。IRCのボットにしようかと思ってます。
0028名無しさん@お腹いっぱい。2005/04/18(月) 23:52:10
>>25
どうやら別のとこが悪かったみたいです。
ありがとうございました。
0029名無しさん@お腹いっぱい。2005/04/19(火) 00:04:59
LogBot (http://www.jibble.org/logbot/) を使っています。
実際のスクリプトでは、最後の行にlftpでログをミラーする文を追加しています。

#!/bin/sh
if ! ps augxww | grep -v grep | grep "java -classpath .:./lib/pircbot.jar org.jibble.logbot.LogBotMain"
then
echo "Restarting LogBot...."
(cd /path/to/LogBot && java -classpath .:./lib/pircbot.jar org.jibble.logbot.LogBotMain) 2>&1 | tee /path/to/LogBot.log
fi

そのまんまでひねりが無いですが、ま、動いています。
0030名無しさん@お腹いっぱい。2005/04/19(火) 05:57:48
無限ループで
終了したら開始するようにしたらダメ?
0031名無しさん@お腹いっぱい。2005/04/19(火) 08:56:01
そういうときの常道としてはPIDファイルを書き出してシェルスクリプトから
execすればいい。

で、PIDファイルに対応するプロセスが死んでたらまたexecして、
生きてたらそのまま終了する。これをcronで好きな間隔でまわせばいい。
0032名無しさん@お腹いっぱい。2005/04/19(火) 10:52:54
>>23 >>27
root に無断でそういうことをするのはやめてくれ。
0033名無しさん@お腹いっぱい。2005/04/21(木) 20:44:53
シェルはbashです

rshを使ってサーバAからサーバBとサーバCに
配置してあるスクリプトXを非同期に実行させようとしています

rshで実行したスクリプトXの戻り値を取得しようと
スクリプトXの戻り値を(Aの)標準出力に表示させているんですが

1 rsh -n servA 'X'&
2 rsh -n servB 'X'&
3 AとBからの戻り値を標準出力から取り込むまで待機する

1と2の処理の間にservAの戻り値が表示されてしまうと
3で止まったままになってしまう気がします

どうすればうまく待ち合わせができるんでしょうか

そもそもrshなんか使うなというツッコミは無しの方向でお願いします

0034名無しさん@お腹いっぱい。2005/04/21(木) 21:35:33
全部フォアで動かせばいいんちやうの?
イマイチ、何をしたいのかが不明だけど。
0035名無しさん@お腹いっぱい。2005/04/21(木) 21:42:23
>>33
> 3 AとBからの戻り値を標準出力から取り込むまで待機する
が意味不明
0036名無しさん@お腹いっぱい。2005/04/21(木) 21:43:26
>>33 は、戻り値の意味を取り違えてるな。
戻り値って終了ステータスのことだよ。
それから、&を付けてバックグラウンドにすると、
戻り値はすべて0になるから、判定不可能になる。
&をやめてフォアグラウンドにしても、
rsh越しだと戻り値を取得できず、
やはりすべて0になって判定不可能になる。
0037332005/04/21(木) 22:21:53
表現の仕方が間違っていました。反省

rshそのものの戻り値($?)を得たいのではなく
rsh越しのスクリプトXの戻り値を得たいので
スクリプトX側で標準出力に終了を表す文字列(0とかcompleteとか)を表示すれば
擬似的な戻り値を得られると思ったんですが

やりたい事はこうです

A: ->(Xを実行しろと命令してすぐリターン) B
B: Xが終わったのでecho 0(完了の意)
A: Aの端末に0が表示される
A: 0と表示されたのを確認してBのお仕事xが終わったと判断


ひょっとして俺はなにか思い違いをしてます?
0038名無しさん@お腹いっぱい。2005/04/21(木) 22:54:13
> ひょっとして俺はなにか思い違いをしてます?
かなりしてそう。
まず、rshとかAとかBとかもちだすからいかんのだ。

時間のかかるコマンドxとyがある。でどうしたい?
0039名無しさん@お腹いっぱい。2005/04/21(木) 23:03:24
うほっ
0040名無しさん@お腹いっぱい。2005/04/21(木) 23:10:16
>>38
>> ひょっとして俺はなにか思い違いをしてます?
>かなりしてそう。
やはりですか

>時間のかかるコマンドxとyがある。でどうしたい?
xとyを非同期に実行させたいわけです

xを実行
(x:実行中)
yを実行
(x:実行中y:実行中)
xとyの完了を待つ(どちらが先に完了するかは不明)
0041名無しさん@お腹いっぱい。2005/04/21(木) 23:10:25
>>33
3 の実現方法がよく分からんのだが、、、ってのは置いといて、
rsh -n servA 'X' > /tmp/a.$$ & とかして、そのファイルの中身をチェックすればいいんでは?

>>36
バックグラウンドでもwaitとかで取れるだろ。
戻り値取得ってsshならOKだけど、rshってNGなん?
0042名無しさん@お腹いっぱい。2005/04/22(金) 00:01:42
rshだと戻り値取得NGだよ。
でも元質問が「rshなんか使うなというツッコミは無しの方向で」
と言ってるからな。
0043名無しさん@お腹いっぱい。2005/04/22(金) 00:54:03
単に x と y を並列に実行させて、両方が終わるまで待ちたいってことだろ?
戻り値なんてどこに出てくる必要があるんだ?
x & y & wait
0044名無しさん@お腹いっぱい。2005/04/22(金) 01:34:58
>>43
ここはバカばっか。肛門で茶が沸くわw
0045名無しさん@お腹いっぱい。2005/04/22(金) 01:42:44
それはすごい。コンビを組んで売り出すべきだ。
0046名無しさん@お腹いっぱい。2005/04/22(金) 01:49:06
そしてトルコへ公演ツアーへ逝くべし
0047名無しさん@お腹いっぱい。2005/04/23(土) 03:14:33
どなたか前スレ.datを下さi
0048名無しさん@お腹いっぱい。2005/04/23(土) 04:14:04
>>47
ttp://upup2.com/ @1MB up3220
0049名無しさん@お腹いっぱい。2005/04/23(土) 04:18:26
>>47
ttp://makimo.to/2ch/pc8_unix/1101/1101820646.html
ttp://makimo.to/cgi-bin/html2dat/html2dat.cgi?pc8_unix/1101/1101820646.html
0050ero usen-221x255x68x19.ap-US01.usen.ad.jp/2005/04/23(土) 05:43:51
    っ        ァ        w          ぇ っ             
       と       ァ          w    ぇ    ww           
         る       う              う                
えぇ         ぉハ ハ        お   w          w          
   け  し   の        は w  k    wう                  
     
0051名無しさん@お腹いっぱい。2005/04/23(土) 08:25:41
これも、ワーム?
0052名無しさん@お腹いっぱい。2005/04/23(土) 09:46:46
んだ
なぜかUNIX板でよく見るのは気がする
0053472005/04/23(土) 12:48:33
>48,49
サンクス
0054名無しさん@お腹いっぱい。2005/04/24(日) 11:21:46
>>37
誰もXからの出力を読んでないじゃないか。

for host in servA servB; do
(exit `rsh -n $host 'X'`) &
done
wait
0055名無しさん@お腹いっぱい。2005/04/26(火) 17:29:16
プログラムはシェルスクリプトが一番頻繁に書かれていると思うのだが。
質問無いね。
0056名無しさん@お腹いっぱい。2005/04/26(火) 19:16:46
すいません。質問です。

-------------------------
[test1]
number = 8
hoge = "foo"

[test2]
rock = 89
scottie = "sharp"
again = 123

[test3]
number = 998
hoge = "thinking"


[test4]
ms = "end"

-------------------------

こんなiniファイルがあったとして、
「test2」「test4」を消したいんですが、
そんなシェルできるのでしょうか?

0057名無しさん@お腹いっぱい。2005/04/26(火) 19:16:51

完成系
-------------------------
[test1]
number = 8
hoge = "foo"

[test3]
number = 998
hoge = "thinking"


-------------------------
0058名無しさん@お腹いっぱい。2005/04/26(火) 19:19:48
さぁ!シェルの作り方についての質問が出ました!
0059名無しさん@お腹いっぱい。2005/04/26(火) 19:27:24
>>56
cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
0060名無しさん@お腹いっぱい。2005/04/26(火) 19:53:31
sedつこてるやん。
だったらおれもperlつかって

cat ini | perl -e '$/="";while(<>){if($_ !~ /\[test[24]\]/){print $_;}}'
0061名無しさん@お腹いっぱい。2005/04/26(火) 19:58:32
え、sed禁止なの?
0062名無しさん@お腹いっぱい。2005/04/26(火) 20:03:56
>>59
/bin/sh ; zsh4.2.0 ; bash 3.00.16だと
$ cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
[test1]
number = 8
hoge = "foo"

[test2]
rock = 89
scottie = "sharp"
again = 123

[test3]
number = 998
hoge = "thinking"


[test4]
ms = "end"

/bin/tcsh; /bin/cshだと
%cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
変数名が不正です.

だめじゃん。

0063名無しさん@お腹いっぱい。2005/04/26(火) 20:09:04
\を\に変えてみて。
0064名無しさん@お腹いっぱい。2005/04/26(火) 20:16:46
¥を\にかえてみて
0065名無しさん@お腹いっぱい。2005/04/26(火) 20:20:26
釣りはそのくらいにしとけ。
0066名無しさん@お腹いっぱい。2005/04/26(火) 20:26:19
>>60 $/=""; ってなに?
0067名無しさん@お腹いっぱい。2005/04/26(火) 20:39:48
にゅうりょくれこーどせぱれーた
0068名無しさん@お腹いっぱい。2005/04/26(火) 20:59:43
>>60
もすこしエレガントに。

cat ini | perl -ne 'BEGIN{$/=""}; /\[test[24]\]/ or print;'
0069名無しさん@お腹いっぱい。2005/04/26(火) 22:58:39
cat ini の存在意義について
0070名無しさん@お腹いっぱい。2005/04/26(火) 23:02:10
Perl使うんなら無いよな
0071562005/04/26(火) 23:28:34
すげぇ。。
やっぱ余裕でできるんですね。
もっと勉強します。
ちなみにAIX4.3でperlないっすね・・・
0072名無しさん@お腹いっぱい。2005/04/26(火) 23:45:02
bash のドキュメントの bash.texi ファイルってどうして
Command Line Editing

Using Interactive History
が入ってないんだろう?ドキュメントを加工するから texi ファイル
で全ドキュメントが欲しいんだけど
0073名無しさん@お腹いっぱい。2005/04/26(火) 23:45:12
>>62
ダブルクオートをシングルクオートにかえりゃいいじゃん。
どのシェルでもいけるだろ。
0074名無しさん@お腹いっぱい。2005/04/26(火) 23:51:40
どっちかと正規表現の類かもしれないですが教えてください
egrepを使用して

「先頭にABCまたはDEFを含むが、それ以降文中にGHIを含まない」
処理を行いたいと以下の様にしました

egrep "^(ABC|DEF)" | egrep -v "GHI"

マッチしない:ABChogeGHI
マッチする:DEFhogefoo

が、grepを二回呼ぶのはかっちょ悪い気がします
うまい事grep一発でマッチさせる方法はあるんでしょうか
0075名無しさん@お腹いっぱい。2005/04/27(水) 00:33:09
かっこなんか気にすんな
0076名無しさん@お腹いっぱい。2005/04/27(水) 00:39:57
>>74
sed -e '/^\(ABC\|DEF\)/{ /GHI/d; }'
0077562005/04/27(水) 11:46:05
前回質問させていただいた
iniファイルの特定のセクションを削除するというやつなんですが。
複数のiniファイルの複数のセクションを消したいのです。
例えば
/hoge/foo/test1.iniの[bar22]と[bar33]
/hoge/goo/test3.iniの[test51]と[tea312]と[write556]
/hoge/asdf.iniの[read52]
・・・
ってな感じなんです。
自分のイメージでは消したいiniとセクションをどっかのテキストに書いておいて
んでそれを読み込みながら削除するって感じになるんですかね。
是非教えてください
/bin/sh
0078名無しさん@お腹いっぱい。2005/04/27(水) 11:54:37
>>77
自分ではどこまでできたの?
0079名無しさん@お腹いっぱい。2005/04/27(水) 12:36:27
元質問はシェルを作る話だったのに解決してない件
0080名無しさん@お腹いっぱい。2005/04/27(水) 13:02:00
>>77
別にシェルスクリプトにこだわらなくてもいいんじゃないの。
Windowsのreg.exeみたいな単発ユーティリティ作ったら。
0081名無しさん@お腹いっぱい。2005/04/27(水) 13:10:06
shutils と textutils と /bin に入ってるものくらいの外部コマンドは
使ってもいいというルールならどうかな。

内部コマンドだけではつらい。
bashならできるか。
0082名無しさん@お腹いっぱい。2005/04/27(水) 15:14:31
ini test2 test4
ini2 test1 test3

とか書きこんだファイルの名前を引数にして起動

#!/bin/sh
list=$1
exec < $list
while read LINE;do
for i in $LINE;do
if [ -z $file ];then
file=$i;
else
section=$i
ed $file <<EOF
/$section/
.,/^$/d
w
q
EOF
fi
done
file=""
done

0083名無しさん@お腹いっぱい。2005/04/27(水) 18:43:01
gnu coreutils と bash まで OK
0084562005/04/27(水) 23:44:33
みなさんありがとうございました。
0085名無しさん@お腹いっぱい。2005/04/29(金) 05:20:17
関数を作って戻り値を取得するにはどうしたら良いでしょう?
以下のようにすると、当然ながら $result に "func" という
文字列が代入されてしまいます・・・

func() {
  return aaa
}

result=func
0086名無しさん@お腹いっぱい。2005/04/29(金) 05:27:40
こういう事?

% func() { echo aaa}
% result=$(func)
% echo $result
aaa
%
0087名無しさん@お腹いっぱい。2005/04/29(金) 07:01:48
>>86
やってみましたが、
bash: fg: %: no such job
bash: fg: %: no such job
 :
と表示されてしまいます。
0088名無しさん@お腹いっぱい。2005/04/29(金) 07:14:38
>>87
% はプロンプトだから入力しないで良いよ
0089名無しさん@お腹いっぱい。2005/04/29(金) 07:28:01
sh だとセミコロン無いと実行出来なかった。
↓これで試してみて。

#!/bin/sh
func() { echo aaa ;}
res=$(func)
echo $res
0090名無しさん@お腹いっぱい。2005/04/29(金) 09:25:57
`func`
0091名無しさん@お腹いっぱい。2005/04/29(金) 10:21:55
こんなのも。

func() {
  ret=aaa
}
result=$ret

戻り値とは言わんけど。
0092名無しさん@お腹いっぱい。2005/04/29(金) 10:51:09
func() { eval $1='aaa'; }
func ret
echo $ret
0093名無しさん@お腹いっぱい。2005/04/29(金) 11:51:30
>>92
それは、いろいろ応用が利きそうだね。
0094名無しさん@お腹いっぱい。2005/04/29(金) 19:39:36
>>93
効かない。
0095852005/04/30(土) 06:03:43
なるほど・・・return でなくって echo を使うと、コマンドの出力として
受け取れるわけですね。一般的な sh の処理かどうかは分かりませんが、
とりあえずコレでやってみようと思います。

func() {
  echo aaa
}

result=`func`

0096名無しさん@お腹いっぱい。2005/04/30(土) 11:42:40
func(){
  echo aaa
}

func
result=$?
0097名無しさん@お腹いっぱい。2005/05/01(日) 11:10:30
テキストの一番最後の行を切り取って別のテキストに貼り付けたいのですが、
どうやってやるのが一番お勧めですか?
perlでなら出来るのですが、処理が大量に発生するので
もう少し軽い仕組みが出来ないかなと調べているところです。
0098名無しさん@お腹いっぱい。2005/05/01(日) 11:33:55
tail -1 file1 | cat >>file2
0099名無しさん@お腹いっぱい。2005/05/01(日) 11:34:37
tail -1 FILE
0100名無しさん@お腹いっぱい。2005/05/01(日) 11:45:19
>99
m9(^Д^)プギャー
0101名無しさん@お腹いっぱい。2005/05/01(日) 13:06:44
意味のないcatを余分に入れる香具師、初心者に多いな。
0102972005/05/01(日) 13:59:04
tail -1だと元のテキストに最後の一時行が残ってしまいませんか?
コピーじゃなくて切り取りをしたいのですがいい手ありますか?
0103名無しさん@お腹いっぱい。2005/05/01(日) 14:06:22
>>102
m9
0104972005/05/01(日) 14:26:02
m9って何ですか?
検索するとスクリプトとは関係ないものばかりヒットして・・・
■ このスレッドは過去ログ倉庫に格納されています