シェルスクリプト総合 その5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2006/01/21(土) 09:00:29スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0014名無しさん@お腹いっぱい。
2006/01/21(土) 22:29:32ばっちり渡す方法は見つかったのか?
$ cat z
#!/bin/sh
echo 1:"$1"
$ ./z hello world
1:hello
$ ./z "hello world"
1:hello world
$ sh -c './z "hello world"'
1:hello world
$ set "hello world"
$ sh -c './z "$@"'
1:
$ sh -c "./z \"\$@\""
1:
なんつーか前スレの馬鹿は凄いね。
試してから投稿するって基本も出来ないアレ。
やってもないのに日常茶飯事とかいってさ。もうね。
001514
2006/01/21(土) 22:30:02$ sh -c "./z '""$@""'"
1:hello world
なんてやると出来たような気がするが、、、
実はこれだと$2以降がわたらない。
はっきりいって、渡す方法を見つけたら、
チューリング賞物じゃないかな?え?無理?
思い返すとperlの黎明期には、perlなら長年shでは不可能だった
これができるって宣伝を見た覚えがあるし、shじゃ無理ちゃうかな。
0016名無しさん@お腹いっぱい。
2006/01/21(土) 22:33:23無理ですね。
001715
2006/01/21(土) 22:43:30そんなに簡単に気って捨てるなよw
$ arg=""; while [ $# -gt 0 ]; do arg="$arg '$1'"; shift; done; sh -c "./z $arg"
で大丈夫ですよとかって帰ってくるの期待してたのに。
まあ、正直な意見としては面倒だからperlでいいじゃん。
0018名無しさん@お腹いっぱい。
2006/01/21(土) 22:45:28この場合はsh -c "..."を使わなければよい。
0019名無しさん@お腹いっぱい。
2006/01/21(土) 22:51:19惜しいが、それだと引数の中に
普通の文字としてシングルクォートがある場合にうまくいかない。
set " hoge isn't hage " " No, I don't. "
みたいな場合ね。
0020名無しさん@お腹いっぱい。
2006/01/21(土) 22:58:41とか。
0021名無しさん@お腹いっぱい。
2006/01/21(土) 22:59:51今思い付いたが、引数の"とか'とか怪しい文字を全部エスケープし
てしまえばいいのか。
0022名無しさん@お腹いっぱい。
2006/01/21(土) 23:03:43切り返したつもりなんだろうが、一番分かってないのはお前のようだぞw
#このスレは幼稚なやつがいぱ〜いだね。
0023名無しさん@お腹いっぱい。
2006/01/22(日) 02:55:30/home/user2/sample2.txtがオーナーroot、グループroot
このとき一発でsample1.txtのオーナー・グループを user1に、
sample2.txtのオーナー・グループをuser2にするシェル記述法を教えてもらえないでしょうか?
宜しくお願いしますm(_ _)m
0024名無しさん@お腹いっぱい。
2006/01/22(日) 03:18:47chown $id:$id $file # chown $id.$id $file
0026名無しさん@お腹いっぱい。
2006/01/22(日) 03:38:100027名無しさん@お腹いっぱい。
2006/01/22(日) 07:50:220028名無しさん@お腹いっぱい。
2006/01/22(日) 07:54:00コメント記号で本文からはずしてコメント化するってこと?
あるいはコメントしてあるところのコメントを除去して非コメント化すること?
0029名無しさん@お腹いっぱい。
2006/01/22(日) 09:01:110030名無しさん@お腹いっぱい。
2006/01/22(日) 12:49:30ときどき勘違いしている人がいるよね。
0031名無しさん@お腹いっぱい。
2006/01/22(日) 13:01:47一語で表す表現ってあったっけ? 餡こめんと?
0032名無しさん@お腹いっぱい。
2006/01/22(日) 13:02:300033名無しさん@お腹いっぱい。
2006/01/22(日) 13:11:03「行頭の # を削除」とか言った方がいい。
0034名無しさん@お腹いっぱい。
2006/01/22(日) 13:27:140036名無しさん@お腹いっぱい。
2006/01/22(日) 16:32:53日本だとセクシャルハラスメント
0037名無しさん@お腹いっぱい。
2006/01/22(日) 18:35:460038名無しさん@お腹いっぱい。
2006/01/24(火) 00:15:54どうやったらいいんでしょうか?
find . -mtime +7 -print | xargs rm
これだと、指定したフォルダの配下のフォルダも削除対象になっていまうので
指定したフォルダだけ検索するようにしたいのですがよい方法はありませんでしょうか?
0039名無しさん@お腹いっぱい。
2006/01/24(火) 00:17:360040名無しさん@お腹いっぱい。
2006/01/24(火) 00:22:43シェルスクリプトについて、もう少しルシェルシェ (recherche) しましょう
0041名無しさん@お腹いっぱい。
2006/01/24(火) 00:35:19ls > ls.out でそのフォルダのファイル一覧を出力して
エクセルで編集してコピペ実行。
0042名無しさん@お腹いっぱい。
2006/01/24(火) 01:33:23findに「-type f」を入れれ。
0043名無しさん@お腹いっぱい。
2006/01/24(火) 01:34:350044名無しさん@お腹いっぱい。
2006/01/24(火) 01:52:430045名無しさん@お腹いっぱい。
2006/01/24(火) 03:45:430046名無しさん@お腹いっぱい。
2006/01/24(火) 07:07:39突っ込みどころなのか?
昔のシステムに乗ってる find は -print 書かないと
何も出力しないんだが...
0047名無しさん@お腹いっぱい。
2006/01/24(火) 07:35:50いや勉強になりますな
0048名無しさん@お腹いっぱい。
2006/01/24(火) 07:42:41シェルってゆうな、クズ。
0049名無しさん@お腹いっぱい。
2006/01/24(火) 08:16:470050名無しさん@お腹いっぱい。
2006/01/24(火) 08:34:39The '#!'-magic, some details about the shebang mechanism on various Unix flavours
ttp://www.in-ulm.de/~mascheck/various/shebang/
0051名無しさん@お腹いっぱい。
2006/01/24(火) 09:07:30危険だから xragsは使うな。
意図しないファイルが削除されたりするぞ。
0052名無しさん@お腹いっぱい。
2006/01/24(火) 09:51:070053名無しさん@お腹いっぱい。
2006/01/24(火) 13:34:27xargsで意図しないファイルが消されるのって、ファイル名の問題以外は、
-execでも同様な気がするんだけど、違うの?
0054名無しさん@お腹いっぱい。
2006/01/24(火) 14:19:13>ファイル名の問題以外は、
重要な問題を「以外」で片付けるなよ。
0055名無しさん@お腹いっぱい。
2006/01/24(火) 14:43:170056名無しさん@お腹いっぱい。
2006/01/24(火) 15:11:38というか、意図しないファイルが削除されたりしない!
0057名無しさん@お腹いっぱい。
2006/01/24(火) 15:33:14xargsには、スペース、シングルクォート、ダブルクォート、改行などを含む
ファイル名を正しく処理できないという仕様バグがあります。
(例: 「I'm a girl.mp3」などというファイル名はイマドキ結構ある)
これを回避する唯一の方法は、findの -print0オプションと xragsの-0オプションを
組み合わせて使用することです。しかし、Solarisのfind/xargsには
これらのオプションがないため、移植性重視のシェルスクリプトでは結局、
xargsを使用しないのが懸命です。
0058名無しさん@お腹いっぱい。
2006/01/24(火) 16:28:43+ これらは GNU coreutils の拡張オプションであるため、
じゃね?GNU 以外で -print0, -0 のある実装ってあるの?
0059名無しさん@お腹いっぱい。
2006/01/24(火) 16:34:22必死だなw
0060名無しさん@お腹いっぱい。
2006/01/24(火) 16:36:45HPUXに -0 ってついてますか?
0061名無しさん@お腹いっぱい。
2006/01/24(火) 17:51:25それが唯一の方法は言い過ぎだろう。
-execを使うという手もある。xargsの出番はなくなるけど。
0062名無しさん@お腹いっぱい。
2006/01/24(火) 18:06:21GNU coreutilsじゃなくて GNU findutils。
あと、FreeBSDの find xargsは GNUではないけど -print0 -0 が使える。
0063名無しさん@お腹いっぱい。
2006/01/24(火) 18:39:18それがなければxargs使わないけど。
0064名無しさん@お腹いっぱい。
2006/01/24(火) 18:44:59検索結果のリストを編集汁る。
0065名無しさん@お腹いっぱい。
2006/01/24(火) 19:32:28> Solarisのfind/xargsにはこれらのオプションがないため、
あります。
0066名無しさん@お腹いっぱい。
2006/01/24(火) 19:37:27テンプレ?
0067名無しさん@お腹いっぱい。
2006/01/24(火) 21:12:37それいつから?
すくなくとも, 現場で稼働してる
% uname -a
SunOS ns11 5.9 Generic_112233-06 sun4u sparc SUNW,UltraAX-i2
な, マシンでは使えないんだが...
0068名無しさん@お腹いっぱい。
2006/01/24(火) 21:41:24なんてオプション?
0069名無しさん@お腹いっぱい。
2006/01/24(火) 21:58:07Solaris 10でも無いよ。嘘はイカンよ。
0070名無しさん@お腹いっぱい。
2006/01/25(水) 02:40:570071名無しさん@お腹いっぱい。
2006/01/25(水) 12:27:16tar Ozxf hoge.tgz | grep arekore
とかやってもどのファイルにあったか分からないんで困ってます。
そりゃファイルを展開すればいいけど、また削除するのが面倒です。
tarのオプション`O'はファイルを作らないでSTDINに出してくれるので
これとシェルスクリプトの何か使ってファイル名と行数を出してくれる
ようなことできないでしょうか。
0072名無しさん@お腹いっぱい。
2006/01/25(水) 12:34:200073名無しさん@お腹いっぱい。
2006/01/25(水) 12:42:53tar Ozxvf hoge.tgz 2>&1 |
だと、ファイル名も出てくるから、何とか加工できるかもしれんが、
はげしくtarの実装に依存しそう
0074名無しさん@お腹いっぱい。
2006/01/25(水) 12:44:37tar Ovzxf hoge.tgz 2>&1 | egrep '^hoge-1.0/|arekore'
くらいで我慢して貰えないか?
perlならArchive::Tar使ってなんとでもなるけども。
0075名無しさん@お腹いっぱい。
2006/01/25(水) 23:00:20ご返答ありがとうございます。今、帰りますた。
で、実はcygwinでやってまして、まず、以下の環境で>>74さんの
でやってみたのですが、何にも出てこなかったっす。
~$ tar --version
tar (GNU tar) 1.15.1
~$ egrep --version
egrep (GNU grep) 2.5.1
でもって>>72さんのでやればいいことに気づきました。ってか、
それは気づいていたんですけどやりたくなかったんですが…
0076名無しさん@お腹いっぱい。
2006/01/27(金) 00:49:240077名無しさん@お腹いっぱい。
2006/01/27(金) 19:29:46と書いた場合の挙動ってどのシェルも同じ?
0078名無しさん@お腹いっぱい。
2006/01/27(金) 19:53:020079名無しさん@お腹いっぱい。
2006/01/27(金) 20:11:06どのシェルも同じ。
>>78
すべて実行されるわけないだろ。
0080名無しさん@お腹いっぱい。
2006/01/27(金) 21:24:44command2 が偽を返したらすべて実行されるんじゃないか?
>>77
どのシェルも同じかどうかはシェルを特定しないと答えようがないな
変な仕様の独自シェルだってありえるし
0081名無しさん@お腹いっぱい。
2006/01/27(金) 21:34:04□お約束
・特記なき場合はbourne shがデフォルトです。
「無条件ですべて実行される」わけないだろ。
0082名無しさん@お腹いっぱい。
2006/01/27(金) 21:50:02という質問にそれはないだろ。
0083名無しさん@お腹いっぱい。
2006/01/27(金) 22:16:00を見るのか、command2 の結果を見るのか、っていうのがシェルごとに違うか?
っていう質問ならば「違わない」。
0084名無しさん@お腹いっぱい。
2006/01/27(金) 22:42:33|| がcommand1の結果を見るのは実験してわかったのですが、manual を読んで
もきちんと書かれていないように見えます。私の読みかたが甘いのでしょう
か?
0085名無しさん@お腹いっぱい。
2006/01/27(金) 22:44:290086名無しさん@お腹いっぱい。
2006/01/27(金) 22:48:25右項を評価するかどうかは、左項の値による。
Cとおんなじ。
0087名無しさん@お腹いっぱい。
2006/01/27(金) 22:51:330088名無しさん@お腹いっぱい。
2006/01/27(金) 23:07:32$ ./success.sh && ./success.sh || echo failure
$ ./success.sh && ./failure.sh || echo failure
failure
$ ./failure.sh && ./success.sh || echo failure
failure
>84
論理演算って知ってる?0 && 1も1 && 0も0だろ。
command1が失敗したらcommand2なんか実行しないんだよ。
0089名無しさん@お腹いっぱい。
2006/01/27(金) 23:09:55いや、command2 が実行されないのは不思議ではないです。
command3 が command1 の $? を見るのがどこに書かれているのかなぁと。。
0090名無しさん@お腹いっぱい。
2006/01/27(金) 23:23:07> command1 && command2 || command3
は、
(command1 && command2) || command3
と同じ。man shの"優先順位"も見れ!
0091名無しさん@お腹いっぱい。
2006/01/27(金) 23:24:13そしたらcommand1の結果を見るしかないじゃんw
88の例でも、success && success || echo failureなら何もでてないわけで、
command1とcommand2の両方の結果をちゃんと見てるジャン。
実行されないのは不思議ではないとか口ではいっときながら理解してないYo!
0092名無しさん@お腹いっぱい。
2006/01/27(金) 23:36:28(゚Д゚)ハァ?哲哉してて頭おかしかったようです。。
0093名無しさん@お腹いっぱい。
2006/01/27(金) 23:45:30>command1が失敗したらcommand2なんか実行しないんだよ。
x が偽ならば y に関係なく x && y が偽なのは事実だが、
y を評価せずに済ませるかどうかは論理演算とはまったく何の関係もない。
sh を含めほとんどの言語がそう実装されているだけ。
0094名無しさん@お腹いっぱい。
2006/01/27(金) 23:54:16違います。仕様です。
A && Bは、
if A; then B; fiと同じです。
0095名無しさん@お腹いっぱい。
2006/01/27(金) 23:58:120096名無しさん@お腹いっぱい。
2006/01/27(金) 23:59:320097名無しさん@お腹いっぱい。
2006/01/28(土) 00:00:55(だからshでは最適化してて)command1が失敗したらcommand2なんか実行しないんだよ。
だったらいいんじゃね?重箱の隅つまんね。
0098名無しさん@お腹いっぱい。
2006/01/28(土) 00:05:18>(だからshでは最適化してて)command1が失敗したらcommand2なんか実行しないんだよ。
このカッコの中を省略するのを指摘するのが重箱の隅だというのは
無理がありすぎるだろ。
0099名無しさん@お腹いっぱい。
2006/01/28(土) 00:07:000100名無しさん@お腹いっぱい。
2006/01/28(土) 00:09:080101名無しさん@お腹いっぱい。
2006/01/28(土) 00:12:280102名無しさん@お腹いっぱい。
2006/01/28(土) 00:31:51http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=sh&dir=jpman-5.4.0%2Fman§=0 の
短絡リスト演算子 (Short-Circuit List Operators) を読んでくるように。
0103名無しさん@お腹いっぱい。
2006/01/28(土) 01:16:46そういうお前にはサイエンス社版クヌース4冊の演習問題を宿題として与える
0104名無しさん@お腹いっぱい。
2006/01/28(土) 01:38:110105名無しさん@お腹いっぱい。
2006/01/28(土) 02:12:250106名無しさん@お腹いっぱい。
2006/01/28(土) 12:30:10だと、余分なサブシェルが起動されるから無駄。
command1や2でシェル変数を操作してたら反映されないというバグを生じるし。
{ command1 && command2; } || command3
と、グルーピングにするべき。
もちろん、&&の方が優先順位が高いから、
command1 && command2 || command3
と書いても同じことだけど。
0107名無しさん@お腹いっぱい。
2006/01/28(土) 12:35:310108名無しさん@お腹いっぱい。
2006/01/28(土) 12:38:08> もちろん、&&の方が優先順位が高いから、
そういう問題なん?
0109名無しさん@お腹いっぱい。
2006/01/28(土) 12:48:330110名無しさん@お腹いっぱい。
2006/01/28(土) 13:23:52同じ優先順位だから左側の演算子(&&)の方が優先順位が高いという意味だろ。
あげ足ばっかだな。
0111名無しさん@お腹いっぱい。
2006/01/28(土) 13:32:29それは優先順位が高いと言わない。
「左に結合する」などが適切な表現。
優先順位は別の概念。
0112名無しさん@お腹いっぱい。
2006/01/28(土) 13:38:560113名無しさん@お腹いっぱい。
2006/01/28(土) 14:08:44■ このスレッドは過去ログ倉庫に格納されています