シェルスクリプト総合 その9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/08/15(水) 07:25:02スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0426名無しさん@お腹いっぱい。
2007/11/06(火) 16:21:52ありがとう。FAQでしたか
0427名無しさん@お腹いっぱい。
2007/11/07(水) 18:02:48いろいろやり方はあると思いますが、何か定番ってあるのでしょうか?
0428名無しさん@お腹いっぱい。
2007/11/07(水) 18:32:090429名無しさん@お腹いっぱい。
2007/11/07(水) 19:49:25それだと、特定ディレクトリの特定ファイルの有無。
>>427は、多分任意のディレクトリに何らかのファイルが有るかどうかと言うこと。
0430名無しさん@お腹いっぱい。
2007/11/07(水) 19:56:420431名無しさん@お腹いっぱい。
2007/11/07(水) 20:11:38普通に日本語を解すればエスパーでも何でもない。
>>ディレクトリにファイルがあるかどうかの分岐
財布にお金が有るかどうかの分岐。
>>if [ -f "$dir/$file" ]
if [ -f "$my_saifu/$hyakuenndama" ]
これくらいの違いを何故理解できない?
0432名無しさん@お腹いっぱい。
2007/11/07(水) 20:15:240433名無しさん@お腹いっぱい。
2007/11/07(水) 20:17:37ってことじゃないのか?
0434名無しさん@お腹いっぱい。
2007/11/07(水) 22:38:560435428
2007/11/08(木) 00:18:45if [ `find "$dir" -maxdepth 1 -type f | wc -l` ]; then
0436428
2007/11/08(木) 00:22:040437名無しさん@お腹いっぱい。
2007/11/08(木) 00:24:04結局readdirして見るしかないだろうなぁ。
とりあえず別案。たぶんちょっとだけ速い:
$ test "`echo .* *`" = ".* *" && echo empty
何かあれば展開元パターンと違う文字列になるから条件成立しない。
0438名無しさん@お腹いっぱい。
2007/11/08(木) 00:33:230439名無しさん@お腹いっぱい。
2007/11/08(木) 00:52:33お前頭いいな
0440名無しさん@お腹いっぱい。
2007/11/08(木) 06:29:55諸手を挙げて賛成したい気分だが、なぜか躊躇する。
何でだろう?
0441名無しさん@お腹いっぱい。
2007/11/08(木) 07:43:15それ間違い。空のディレクトリでも . と .. は必ず存在するので、
echo .* * の結果は .. . になる。
0442名無しさん@お腹いっぱい。
2007/11/08(木) 10:53:24しまった、bashismに染まってしまった。今は反省している。
rmdirがいちばんエレガントだね。そのフォルダにプロセスがいたら
根無し草になるというのが躊躇の原因だろうけど。
0443名無しさん@お腹いっぱい。
2007/11/08(木) 12:28:010444名無しさん@お腹いっぱい。
2007/11/08(木) 13:09:570445名無しさん@お腹いっぱい。
2007/11/08(木) 13:15:38test1.shに echo 100
test2.shに echo $1
と書いて
sh test1.sh | sh test2.sh
として、100が表示されることを期待してるんですが、何も表示されません。。
根本がわかってないと思うのですが、このあたり、ご教示頂ければ幸いに思います。
あるいは、こういった部分に触れているサイトがありましたら、リンクを頂く形でも
幸いです。。よろしくお願い致します。
0446445
2007/11/08(木) 13:31:06ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1508581
を見てわかりました。先のtest2.shは
read line
echo $line
などとすればいいんですね。お騒がせしました。
0447名無しさん@お腹いっぱい。
2007/11/08(木) 15:56:500448名無しさん@お腹いっぱい。
2007/11/08(木) 16:04:47消えたら作ればいいと思いつつも>>440が出てきている。
あと、>>444で。
0449名無しさん@お腹いっぱい。
2007/11/08(木) 19:13:21権限なかったら、ダメじゃないの?
0450名無しさん@お腹いっぱい。
2007/11/08(木) 19:33:32ということは、判定ができんということになるな
0451名無しさん@お腹いっぱい。
2007/11/08(木) 22:49:43rmdirの減点にはならないかと。
0452名無しさん@お腹いっぱい。
2007/11/08(木) 23:02:28親のwがないといかんというのは厳しいだろ
0453427
2007/11/10(土) 04:04:04私は [ -z "$(ls dir/)" ] としてましたが、これだと何か問題はあるでしょうか?
しかし、定番って無いのですね。
0454名無しさん@お腹いっぱい。
2007/11/10(土) 04:25:29if ! /bin/ls -a "$dir" | egrep -qv '^\.\.?$'; then
echo 空っぽ
end
0455名無しさん@お腹いっぱい。
2007/11/10(土) 10:20:35ドットファイルがあると判定を誤る。
[ $(ls -a) != 2 ]
0456名無しさん@お腹いっぱい。
2007/11/10(土) 10:50:15ってだめなんだっけ
0457名無しさん@お腹いっぱい。
2007/11/10(土) 12:53:480458名無しさん@お腹いっぱい。
2007/11/10(土) 20:14:03ls -a なんてするから . と .. を除外する余分な処理が増える。
0459名無しさん@お腹いっぱい。
2007/11/10(土) 21:23:19↑が、モストエレガント
0460名無しさん@お腹いっぱい。
2007/11/11(日) 00:49:49tcsh の場合どう記述すればいいんでしょうか?
bash の場合は分かるのですが。。
while true; do ; ps -ef ; sleep 60 ; done
ヒントだけでも良いのでアドバイスお願いします。
0461名無しさん@お腹いっぱい。
2007/11/11(日) 01:35:130462名無しさん@お腹いっぱい。
2007/11/11(日) 01:49:37確か一行じゃできんかったような.
sh -c "while true; do ; ps -ef ; sleep 60 ; done"
じゃ駄目かw
0463名無しさん@お腹いっぱい。
2007/11/11(日) 04:00:30シェルはBournシェル(sh)で書け。(昔、cshで書いて苦労した)
クォートできないケースが多々存在するわ、
標準エラーはパイプに流し込めないわ、
最悪なのが、ファイルを閉じることができないこと。
あと、コンソール入力が一行入力 $< 以外、つかいものにならんから、ユーザ入力が必要なときに苦労するぞ
0464名無しさん@お腹いっぱい。
2007/11/11(日) 08:06:240465名無しさん@お腹いっぱい。
2007/11/11(日) 09:24:02do のあとに ; いらんけどな。
0466名無しさん@お腹いっぱい。
2007/11/14(水) 10:50:21#!/bin/bash
num="1
2
3
4
5"
num2=3
while true ; do
echo "$num" | while read line; do
if [ "$line" -eq "$num2" ]; then
echo $line
break 2
fi
done
done
このスクリプトがbreakできないのですが、どこに間違いがあるのでしょうか?
/bin/bash を zsh に変えれれば動きます。
0467名無しさん@お腹いっぱい。
2007/11/14(水) 11:23:34break 2 ではなくふつーにサブシェルが終了したようにしか見えない。
0468名無しさん@お腹いっぱい。
2007/11/14(水) 11:48:18シェルの実装違い。
似たものに
while read〜do〜done < FILE
これについても各種シェルで動きが違う。
0469名無しさん@お腹いっぱい。
2007/11/14(水) 22:54:11↓ここも参照しる。
http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936
0470466
2007/11/15(木) 02:30:33なんじゃそりゃという話でした…
0471名無しさん@お腹いっぱい。
2007/11/15(木) 18:33:38連番のファイルを作りたいんだけど、
なんかいい手ある?
for i in ${ABC}
do
cp XXX.txt ${i}.txt
done
個人的には、↑みたいなので簡単に出来るかと思ったけど
${ABC}にハメるAAA,AAB,AAC〜ZZZのリストが
作れなくて。
助けてエロい人。
0472名無しさん@お腹いっぱい。
2007/11/15(木) 18:49:30for in in {A..Z}{A..Z}{A..Z}
do
:
0473471
2007/11/15(木) 18:55:57スマソ、言葉足らずだった。
ウチのシステムsolaris8でbash-2.03なんだ。うん。
{A..Z}って、bash-3.0からの拡張機能だったような。
0474名無しさん@お腹いっぱい。
2007/11/15(木) 18:57:49を3回まわせばいいじゃん。
0475471
2007/11/15(木) 19:54:07言わんとしてることがイマイチ汲み取れなんだ。ごめん。
アホな俺にも分かるようにもうちょいとkwsk説明してくれん?
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt ${i}.txt
done
done
done
こう、ネストしろとか…じゃないんだよな。
0476名無しさん@お腹いっぱい。
2007/11/15(木) 20:32:50do
for j in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
for k in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
cp XXX.txt $i$j$k.txt
done
done
done
0477471
2007/11/15(木) 20:39:19本気でありがとう神様
0478名無しさん@お腹いっぱい。
2007/11/18(日) 03:10:54の http://xxx だけ抜き出したいのですが、ズバッと一つのコマンドで
できないでしょうか?
0479名無しさん@お腹いっぱい。
2007/11/18(日) 07:07:460480名無しさん@お腹いっぱい。
2007/11/18(日) 08:09:360481名無しさん@お腹いっぱい。
2007/11/18(日) 11:18:480482名無しさん@お腹いっぱい。
2007/11/18(日) 17:37:56478がどういうのを求めているか知らんが、それだと汎用性がなくて使えないのでは?
というかexprって計算以外にも使えるんだ
0483無名
2007/11/18(日) 20:05:48echo '<a href="http://xxx">' | sed 's/[^"]*"\(.*\)".*/\1/'
0484名無しさん@お腹いっぱい。
2007/11/18(日) 20:17:38汎用的にアンカー抜き出したいんなら、素直にHTMLパーサが利用できる
言語使えや
0485名無しさん@お腹いっぱい。
2007/11/19(月) 02:13:59perl -e 'for ($val = "AAA"; $val ne "AAAA"; $val++) { print $val, "¥n";}'
0486名無しさん@お腹いっぱい。
2007/11/19(月) 08:23:440487名無しさん@お腹いっぱい。
2007/11/19(月) 08:52:11perl -e 'print "$_\n" for "AAA".."ZZZ"'
0488名無しさん@お腹いっぱい。
2007/11/19(月) 09:56:22汎用性求めてるならそう書いてくれないと。
0489名無しさん@お腹いっぱい。
2007/11/20(火) 23:47:47シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0490名無しさん@お腹いっぱい。
2007/11/20(火) 23:49:420491名無しさん@お腹いっぱい。
2007/11/20(火) 23:58:04if fi else test echo -eq -ge -le -a $1 $2
0492名無しさん@お腹いっぱい。
2007/11/21(水) 00:05:400493名無しさん@お腹いっぱい。
2007/11/21(水) 01:06:18シェルを作成したいのですがどのような構文を使用すれば
良いか教えて頂けないでしょうか。よろしくお願いします。
0494名無しさん@お腹いっぱい。
2007/11/21(水) 01:07:480495名無しさん@お腹いっぱい。
2007/11/21(水) 01:30:51>>493
構文としては順序構文と条件文でできるんじゃない?
0496名無しさん@お腹いっぱい。
2007/11/21(水) 01:54:440497名無しさん@お腹いっぱい。
2007/11/21(水) 06:52:410498名無しさん@お腹いっぱい。
2007/11/21(水) 07:13:300499名無しさん@お腹いっぱい。
2007/11/21(水) 21:36:16>>1 参照
0500名無しさん@お腹いっぱい。
2007/11/21(水) 21:43:34アフォか? >>1 のどこに書いてあるのかと。
0501名無しさん@お腹いっぱい。
2007/11/21(水) 22:00:33>>499はtypoにも気づかず流れも読めなかったのだろうね
0502名無しさん@お腹いっぱい。
2007/11/23(金) 15:22:11⊂二二二( ^ω^)二⊃ ブーン
0503名無しさん@お腹いっぱい。
2007/11/24(土) 07:02:18マジレス頼む。
0504名無しさん@お腹いっぱい。
2007/11/24(土) 09:23:110505名無しさん@お腹いっぱい。
2007/11/24(土) 11:05:490506名無しさん@お腹いっぱい。
2007/11/24(土) 19:48:21カーソル移動にはhjklを使えってことなんでしょうけど、でもviクローンなんかはカーソル有効になってるのも多いですよね。いい方法ないかなぁ。
0507名無しさん@お腹いっぱい。
2007/11/26(月) 13:01:12perlだとNGってことありますね。perl読み書きできない管理者多いし。
shスクリプトの場合は「読めない香具師が悪い」が正論として通る。
# ある程度の規模のものは perl, python, ruby で何とかしたい…
# ただの愚痴でした。
0508名無しさん@お腹いっぱい。
2007/11/26(月) 16:54:12かめれすだが、
perl -le 'print for "AAA".."ZZZ"'
で十分
0509名無しさん@お腹いっぱい。
2007/11/26(月) 23:16:16そうかなあ、用途によっちゃperlで作るけどね。
ただ鯖管理用途?だとシェルスクリプトのほうがシンプルにできると思うけど
0510名無しさん@お腹いっぱい。
2007/11/27(火) 15:00:07今の時間から明日の15時までの秒数、とかが知りたいのだが。
時刻はどちらも date コマンドの出力を前提に考えているけど、
少々なら事前にフォーマットをいじれる。でも UNIX TIME で
記録するのは勘弁な。
0511名無しさん@お腹いっぱい。
2007/11/27(火) 15:12:44普通に、
expr `date +%s -d 'tomorrow 15:00'` - `date +%s`
0512名無しさん@お腹いっぱい。
2007/11/27(火) 23:19:54511じゃないけど、これをperlでやるとなるとかなり面倒くさい。
だから鯖管理者にいやがられるんじゃないかな。
0513名無しさん@お腹いっぱい。
2007/11/28(水) 12:29:41そらぁシェルでかけるのをわざわざperlで書いたら怒られるだろ。
もっとこう、複雑なフィルタとか、DB使うとか、簡単でいいからメニューが欲しいとかいう
要求があるときにperlとかすんなり使わせてくれよということじゃないの?
0514名無しさん@お腹いっぱい。
2007/11/29(木) 02:15:11システム処理があって、
hogehoge | perl -e '
...
' | fugafuga
みないなことをする必要が出たりすると、#!/usr/bin/perl で書いた方が
きれいかも・・・と悩むことが極稀にあるな。もっともそうすると
$foo = `hogehoge`
system("fugafuga")
open("| herohero")
とかなって、今度は #!/bin/sh で書いた方がきれいかも・・・と悩むのだけど
0515名無しさん@お腹いっぱい。
2007/11/29(木) 06:18:040516510
2007/11/29(木) 15:09:20動かないなぁと悩んでたら、GNU の date じゃないと -d がないのね。
Mac で試してたんできがつかなかった..orz。
ターゲットマシンは Linux で問題なく動作しますたので、この方法で
いきます。
0517名無しさん@お腹いっぱい。
2007/11/29(木) 22:43:51非常に気持ち悪いんですけれど。
何か理由があるんでしょうか?
0518名無しさん@お腹いっぱい。
2007/11/29(木) 22:59:280519名無しさん@お腹いっぱい。
2007/11/29(木) 23:10:57もともとエラーコードだから。
エラーなしが 0 。だから 0 が真。
0520名無しさん@お腹いっぱい。
2007/11/29(木) 23:24:55どんな原因でエラーになったのか調べなきゃいかんからな。
0521名無しさん@お腹いっぱい。
2007/11/30(金) 00:59:52&&や||が逆転してやりづらかったとかとか。
0522名無しさん@お腹いっぱい。
2007/12/04(火) 16:36:46テキストエディタで、
#!/bin/sh
echo Hello World
って書いて、名前を付けて保存をして、
プロパティで実行属性にチェックを入れて、
ファイルのアイコンをクリックしたんですけど、
何も出てきません。何か設定が要るのでしょうか?
0523名無しさん@お腹いっぱい。
2007/12/04(火) 17:37:520524名無しさん@お腹いっぱい。
2007/12/04(火) 18:40:580525名無しさん@お腹いっぱい。
2007/12/04(火) 22:51:08「OSは何ですか」という質問を期待しているのだろうか?
■ このスレッドは過去ログ倉庫に格納されています