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

このエントリーをはてなブックマークに追加
952名無しさん@お腹いっぱい。:2006/01/18(水) 09:06:14
詳解 シェルスクリプト
ttp://www.oreilly.co.jp/books/4873112672/
Arnold Robbins、Nelson H. F. Beebe 著
日向 あおい 訳
2006年01月27日 発売予定
372ページ
定価2,940円
ISBN4-87311-267-2
原書: Classic Shell Scripting
953名無しさん@お腹いっぱい。:2006/01/18(水) 09:49:48
よんだことないけど、原書は評価高いな。
http://www.amazon.com/gp/product/0596005954/
954名無しさん@お腹いっぱい。:2006/01/18(水) 12:49:13
詳しそうだけど、ここに出入りしてる人間にとっては、読むのだるそう
955名無しさん@お腹いっぱい。:2006/01/19(木) 00:29:11
>>949
Ctrl-C の後「値の貼り付け」。
956名無しさん@お腹いっぱい。:2006/01/19(木) 01:21:10
>>951
最近、Mac OS Xとかmp3なファイルとか、
空白を含むパス名が増えてきたから、

> files=$(eval echo '*.c')
> echo $files

こういう展開されたのを保持するやり方は厳しくなったな。

> ext='*.c'
> echo $ext

じゃないと空白入りのパス名が分離されちゃう。
957名無しさん@お腹いっぱい。:2006/01/19(木) 01:56:32
>>949
hogehoge=`eval "echo $1"`
958名無しさん@お腹いっぱい。:2006/01/19(木) 23:11:24
192.168.1.2 と 255.255.0.0 の論理和を出したいのですが、どうするのが手軽
でしょうか? perl を使ってもいいので教えてください。
959名無しさん@お腹いっぱい。:2006/01/19(木) 23:30:16
>>958
論理*和*なら
echo 255.255.`expr 192.168.1.2 : '[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\.[0-9][0-9]*\)'`
960名無しさん@お腹いっぱい。:2006/01/19(木) 23:31:53
本当に論理和でよかったのだろうか・・・orz
961名無しさん@お腹いっぱい。:2006/01/19(木) 23:47:27
bitwise orだったとしても

$ perl -e '$ip="192.168.1.2"; @a=split(/\./,$ip); @b=split(/\./,"255.255.0.0");\
for ($i = 0; $i < $#a; $i++) { $l=int($a[$i])|int($b[$i]); print "$l."; }\
$l=int($a[$i])|int($b[$i]); print "$l\n";'
255.255.1.2

なわけで、何がやりたいのか悩む...

普通はbitwise andだよな。
962名無しさん@お腹いっぱい。:2006/01/20(金) 00:10:33
#!/bin/sh
sed 's/a//g' < /dev/stdin

標準入力からのデータを加工する上記のようなスクリプト foo があったとして

echo hage | foo

のように使えば問題ないですが、foo 単独で実行した場合に stdin を見にいっ
て返ってこなくなります。stdin からデータが渡されてるかどうかを判別する
うまい方法ってあります?
963名無しさん@お腹いっぱい。:2006/01/20(金) 00:28:51
% tty
/dev/ttyp1
% tty </dev/null
not a tty
964名無しさん@お腹いっぱい。:2006/01/20(金) 00:55:09
うちの部署になんでもかんでもシェルスクリプトでやろうとする人が
いるのですがどうやったらいいでしょうか?
965名無しさん@お腹いっぱい。:2006/01/20(金) 00:59:32
黙ってついて行きなさい
966名無しさん@お腹いっぱい。:2006/01/20(金) 01:19:32
>>962

#!/bin/sh
[ -t 0 ] || sed 's//g/'

これでどう?
967名無しさん@お腹いっぱい。:2006/01/20(金) 10:21:00
すんません。ネットワークアドレスを計算したかったんです。。
968名無しさん@お腹いっぱい。:2006/01/20(金) 10:26:04
>>967
だったら論理和じゃなくて論理積だろ。
969名無しさん@お腹いっぱい。:2006/01/20(金) 12:36:10
>>963,966
なるほど、そうすればいいのか。サンクスでした。
970名無しさん@お腹いっぱい。:2006/01/20(金) 13:07:02
>>958
Net::Netmask
971名無しさん@お腹いっぱい。:2006/01/20(金) 13:44:59
>>975氏に次スレをおながいします
972名無しさん@お腹いっぱい。:2006/01/20(金) 14:40:33
>>957
>>956は無視かよ…
973名無しさん@お腹いっぱい。:2006/01/20(金) 14:44:09
>>962
> foo 単独で実行した場合に stdin を見にいって返ってこなくなります。
> stdin からデータが渡されてるかどうかを判別するうまい方法ってあります?

それが普通だから気にするな。
cat, sed, grep...

> sed 's/a//g' < /dev/stdin

"< /dev/stdin"は冗長。
974名無しさん@お腹いっぱい。:2006/01/20(金) 18:13:08
>>972
まあいいじゃん。
空白を含むファイル名を前提とするかどうかは、人によって違うわけだし。
975名無しさん@お腹いっぱい。:2006/01/20(金) 21:10:11
>>974
普通は前提にするけどな。
976名無しさん@お腹いっぱい。:2006/01/20(金) 21:16:04
>>975
次スレよろ
977名無しさん@お腹いっぱい。:2006/01/20(金) 21:25:29
>>975
そうでもないよ。
978名無しさん@お腹いっぱい。:2006/01/20(金) 21:41:10
いや、普通、前提にする。
$1 $hoge とか、" "なしで書いてあるスクリプトを見るとすぐ「ダメー」と思う。
とくに、$@とか書いてあるとアフォかと思う。
そういう感覚が大切。
979名無しさん@お腹いっぱい。:2006/01/20(金) 22:03:07
>>978
お前の普通は世間の普通じゃない、とだけ言っておく。
980名無しさん@お腹いっぱい。:2006/01/20(金) 22:12:01
"$@"じゃなくて、$*ってのはよくみるなあ。残念。
"$1"じゃなくて、$1なのはもう話にならないと思う。
981978:2006/01/20(金) 22:17:46
>>979
俺は >>975>>980 とは別人だよ。
俺以外に「$var は "$var"と書け」という主張をしている人を複数見ているので、
これが世間一般の普通の考えだと思うが。
982名無しさん@お腹いっぱい。:2006/01/20(金) 22:21:01
理屈にもなんにもなってねえな
983名無しさん@お腹いっぱい。:2006/01/20(金) 22:33:13
"$1"と書かずに$1と書くメリットはまったくない。
984名無しさん@お腹いっぱい。:2006/01/20(金) 22:59:14
スレ違いだが、

sshは引数をスペースを間に入れて結合した文字列をsshdに送る。
sshdは
argv[0] = shell
argv[1] = "-c"
argv[2] = 送られた文字列
のように実行する。
なので'1 2 3'というファイルを指定するためには
ssh localhost touch "'1 2 3'"
のように''をつける必要がある。

シェルを経由して実行する場合は引数(の数と内容)を保ったまま渡
すのは無理なのかもしれんが。
985名無しさん@お腹いっぱい。:2006/01/20(金) 23:07:19
無理じゃない。ここ最近の議論を良く理解しろ。
986名無しさん@お腹いっぱい。:2006/01/20(金) 23:13:11
>>983
めんどい時。
987984:2006/01/20(金) 23:29:30
>>985
シェルを経由して実行って書いたのは
sh -c コマンド
の形式で実行という意味です。

与えられた引数をそのまま sh -c で起動したシェルに渡すのは無
理ではないかと言っているのです。もし可能なら方法をください。
988名無しさん@お腹いっぱい。:2006/01/20(金) 23:30:51
×方法をください
○方法を教えてください
989名無しさん@お腹いっぱい。:2006/01/20(金) 23:59:55
ふつーにできるけど何でできないと思ったんだろ?

$ cat hoge.sh
#!/bin/sh
echo "1:[$1]"
echo "2:[$2]"
echo "3:[$3]"
$ sh -c './hoge.sh "123" "A B C" "x
y
z"'
1:[123]
2:[A B C]
3:[x
y
z]
990名無しさん@お腹いっぱい。:2006/01/21(土) 00:08:16
>>989
ごめん。説明が悪かった。

$ cat hoge.sh
#!/bin/sh
sh -c "$*"

$ hoge.sh touch 'hoge hoge'

これでは'hoge hoge'というファイルは作られない。
hoge.shを書き換えて、hoge.shに渡された引数がhoge.shから起動さ
れたシェルにそのまま渡されるようにしたい。
991名無しさん@お腹いっぱい。:2006/01/21(土) 00:14:16
>>990
お前は馬鹿か? ここ最近の議論を良く理解しろ。

992名無しさん@お腹いっぱい。:2006/01/21(土) 00:25:17
>>991
わかりません><
993名無しさん@お腹いっぱい。:2006/01/21(土) 07:52:25
固定の引数じゃなくて、
すでに "$@" に入っている引数をそのまま、
sh -c の形で引き渡すのはちょっと大変だね。
sh -c だと引数解釈が結果的に2回行なわれるから、
"$@"は1回解釈のものに対してで引数をそのまま渡せるけど、
2回解釈されると困る。

ようするに、"$@" の2回解釈版がシェル文法に存在すれば簡単なのだけど。。
994名無しさん@お腹いっぱい。:2006/01/21(土) 13:48:11
>>993
sh -c は引数を1つしか取らないので"$@"は使えませんよ。使うなら"$*"
995名無しさん@お腹いっぱい。:2006/01/21(土) 13:57:05
sh -c 'foo "$@"' なんて日常茶飯事ですよ。
sh -c 'foo \'some pattern\' "$@"' とか、
sh -c "foo $bar \"$@\"" とかさ。

>>993はevalや〜 Expansionを理解してないね。
996名無しさん@お腹いっぱい。:2006/01/21(土) 13:58:48
>>995
> sh -c 'foo \'some pattern\' "$@"' とか、
おまえこそわかっていないようだな。
997名無しさん@お腹いっぱい。:2006/01/21(土) 13:58:54
>>995
> sh -c "foo $bar \"$@\"" とかさ。

sh -c "foo $bar \"\$@\""

一つ\忘れました。
998名無しさん@お腹いっぱい。:2006/01/21(土) 14:00:17
続きはこつら

シェルスクリプト総合 その5
http://pc8.2ch.net/test/read.cgi/unix/1137801629/
999名無しさん@お腹いっぱい。:2006/01/21(土) 14:00:52
問題はsh -cが引数を1つしか取らないことで、引数を複数許すなら
何も問題はない。
1000名無しさん@お腹いっぱい。:2006/01/21(土) 14:11:55
1000000000000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。