詳しそうだけど、ここに出入りしてる人間にとっては、読むのだるそう
>>951 最近、Mac OS Xとかmp3なファイルとか、
空白を含むパス名が増えてきたから、
> files=$(eval echo '*.c')
> echo $files
こういう展開されたのを保持するやり方は厳しくなったな。
> ext='*.c'
> echo $ext
じゃないと空白入りのパス名が分離されちゃう。
>>949 hogehoge=`eval "echo $1"`
192.168.1.2 と 255.255.0.0 の論理和を出したいのですが、どうするのが手軽
でしょうか? perl を使ってもいいので教えてください。
>>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]*\)'`
本当に論理和でよかったのだろうか・・・orz
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だよな。
#!/bin/sh
sed 's/a//g' < /dev/stdin
標準入力からのデータを加工する上記のようなスクリプト foo があったとして
echo hage | foo
のように使えば問題ないですが、foo 単独で実行した場合に stdin を見にいっ
て返ってこなくなります。stdin からデータが渡されてるかどうかを判別する
うまい方法ってあります?
% tty
/dev/ttyp1
% tty </dev/null
not a tty
うちの部署になんでもかんでもシェルスクリプトでやろうとする人が
いるのですがどうやったらいいでしょうか?
黙ってついて行きなさい
>>962 #!/bin/sh
[ -t 0 ] || sed 's//g/'
これでどう?
すんません。ネットワークアドレスを計算したかったんです。。
>>963,966
なるほど、そうすればいいのか。サンクスでした。
>>962 > foo 単独で実行した場合に stdin を見にいって返ってこなくなります。
> stdin からデータが渡されてるかどうかを判別するうまい方法ってあります?
それが普通だから気にするな。
cat, sed, grep...
> sed 's/a//g' < /dev/stdin
"< /dev/stdin"は冗長。
>>972 まあいいじゃん。
空白を含むファイル名を前提とするかどうかは、人によって違うわけだし。
いや、普通、前提にする。
$1 $hoge とか、" "なしで書いてあるスクリプトを見るとすぐ「ダメー」と思う。
とくに、$@とか書いてあるとアフォかと思う。
そういう感覚が大切。
>>978 お前の普通は世間の普通じゃない、とだけ言っておく。
"$@"じゃなくて、$*ってのはよくみるなあ。残念。
"$1"じゃなくて、$1なのはもう話にならないと思う。
981 :
978:2006/01/20(金) 22:17:46
>>979 へ
俺は
>>975 や
>>980 とは別人だよ。
俺以外に「$var は "$var"と書け」という主張をしている人を複数見ているので、
これが世間一般の普通の考えだと思うが。
理屈にもなんにもなってねえな
"$1"と書かずに$1と書くメリットはまったくない。
スレ違いだが、
sshは引数をスペースを間に入れて結合した文字列をsshdに送る。
sshdは
argv[0] = shell
argv[1] = "-c"
argv[2] = 送られた文字列
のように実行する。
なので'1 2 3'というファイルを指定するためには
ssh localhost touch "'1 2 3'"
のように''をつける必要がある。
シェルを経由して実行する場合は引数(の数と内容)を保ったまま渡
すのは無理なのかもしれんが。
無理じゃない。ここ最近の議論を良く理解しろ。
987 :
984:2006/01/20(金) 23:29:30
>>985 シェルを経由して実行って書いたのは
sh -c コマンド
の形式で実行という意味です。
与えられた引数をそのまま sh -c で起動したシェルに渡すのは無
理ではないかと言っているのです。もし可能なら方法をください。
×方法をください
○方法を教えてください
ふつーにできるけど何でできないと思ったんだろ?
$ 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]
>>989 ごめん。説明が悪かった。
$ cat hoge.sh
#!/bin/sh
sh -c "$*"
$ hoge.sh touch 'hoge hoge'
これでは'hoge hoge'というファイルは作られない。
hoge.shを書き換えて、hoge.shに渡された引数がhoge.shから起動さ
れたシェルにそのまま渡されるようにしたい。
>>990 お前は馬鹿か? ここ最近の議論を良く理解しろ。
固定の引数じゃなくて、
すでに "$@" に入っている引数をそのまま、
sh -c の形で引き渡すのはちょっと大変だね。
sh -c だと引数解釈が結果的に2回行なわれるから、
"$@"は1回解釈のものに対してで引数をそのまま渡せるけど、
2回解釈されると困る。
ようするに、"$@" の2回解釈版がシェル文法に存在すれば簡単なのだけど。。
>>993 sh -c は引数を1つしか取らないので"$@"は使えませんよ。使うなら"$*"
sh -c 'foo "$@"' なんて日常茶飯事ですよ。
sh -c 'foo \'some pattern\' "$@"' とか、
sh -c "foo $bar \"$@\"" とかさ。
>>993はevalや〜 Expansionを理解してないね。
>>995 > sh -c 'foo \'some pattern\' "$@"' とか、
おまえこそわかっていないようだな。
>>995 > sh -c "foo $bar \"$@\"" とかさ。
sh -c "foo $bar \"\$@\""
一つ\忘れました。
問題はsh -cが引数を1つしか取らないことで、引数を複数許すなら
何も問題はない。
1000000000000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。