シェルスクリプト総合 その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 でトレースしましょう。
0004名無しさん@お腹いっぱい。
2006/01/21(土) 09:03:03UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi
Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/
Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/
□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
0005名無しさん@お腹いっぱい。
2006/01/21(土) 09:03:34制御・条件判定系:
[,test,expr,true,false,yes,getopts
テキスト処理系:
cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル名・ディレクトリ系:
find,xargs,basename,dirname
出力系:
echo,printf
対話コマンド制御系:
expect
http/ftpの処理自動化:
wget,curl
0006名無しさん@お腹いっぱい。
2006/01/21(土) 09:04:11Linux 推薦図書/必読書/推薦雑誌/推薦HP
http://pc8.2ch.net/test/read.cgi/linux/1065059126/545
よりコピペ
(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特
別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
0007名無しさん@お腹いっぱい。
2006/01/21(土) 13:59:240008名無しさん@お腹いっぱい。
2006/01/21(土) 14:11:10糞スレ立てんなや
0009名無しさん@お腹いっぱい。
2006/01/21(土) 14:40:35糞スレにいちいち反応する
あんさんのほうが遥かに糞
0010名無しさん@お腹いっぱい。
2006/01/21(土) 14:56:45http://pc8.2ch.net/test/read.cgi/unix/1131026501/994
>sh -c は引数を1つしか取らないので"$@"は使えませんよ。使うなら"$*"
"$*" じゃ空白を含む引数がそのまま渡せません。問題を取り違えています。
前スレ 995
http://pc8.2ch.net/test/read.cgi/unix/1131026501/995
>sh -c 'foo "$@"' なんて日常茶飯事ですよ。
↑あなたも問題を取り違えています。
それでは "$@"には何も渡りません。
set ' hoge boke ' ' arya korya '
のように空白を含む引数がセットされていて、
これを "$@" で参照しつつ、
sh -c の形式で渡すのが非常に困難という話です。
0011994
2006/01/21(土) 15:01:06"$*"が使えないことは分かってる。
http://pc8.2ch.net/test/read.cgi/unix/1131026501/990
0012名無しさん@お腹いっぱい。
2006/01/21(土) 20:01:49つまりお前が一番糞ってこと?
0013名無しさん@お腹いっぱい。
2006/01/21(土) 22:07:49ねえぼく、レスとスレの区別は付けようね〜。
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冊の演習問題を宿題として与える
■ このスレッドは過去ログ倉庫に格納されています