トップページunix
1001コメント273KB

シェルスクリプト総合 その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 でトレースしましょう。
0002名無しさん@お腹いっぱい。2006/01/21(土) 09:01:45
□前スレや過去スレ:
シェルスクリプト総合 その4
http://pc8.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc8.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc8.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc8.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc8.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc8.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
【sed】シェルスクリプト総合@LINUX【awk】
http://pc8.2ch.net/test/read.cgi/linux/1121994321
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0003名無しさん@お腹いっぱい。2006/01/21(土) 09:02:20
□初心者向けリンク
「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/

□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
0004名無しさん@お腹いっぱい。2006/01/21(土) 09:03:03
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
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:11
□スクリプト本の出版ラッシュらしい・・
Linux 推薦図書/必読書/推薦雑誌/推薦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:24
まずは乙だよもん
0008名無しさん@お腹いっぱい。2006/01/21(土) 14:11:10
>>1
糞スレ立てんなや
0009名無しさん@お腹いっぱい。2006/01/21(土) 14:40:35
>>8
糞スレにいちいち反応する
あんさんのほうが遥かに糞
0010名無しさん@お腹いっぱい。2006/01/21(土) 14:56:45
前スレ 994
http://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 の形式で渡すのが非常に困難という話です。
00119942006/01/21(土) 15:01:06
>>10
"$*"が使えないことは分かってる。
http://pc8.2ch.net/test/read.cgi/unix/1131026501/990
0012名無しさん@お腹いっぱい。2006/01/21(土) 20:01:49
>>9
つまりお前が一番糞ってこと?
0013名無しさん@お腹いっぱい。2006/01/21(土) 22:07:49
>>12
ねえぼく、レスとスレの区別は付けようね〜。
0014名無しさん@お腹いっぱい。2006/01/21(土) 22:29:32
で、sh -cで起動する時に空白や改行を含んだ複数の引数を
ばっちり渡す方法は見つかったのか?

$ 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:

なんつーか前スレの馬鹿は凄いね。
試してから投稿するって基本も出来ないアレ。
やってもないのに日常茶飯事とかいってさ。もうね。
0015142006/01/21(土) 22:30:02
ちなみに
$ sh -c "./z '""$@""'"
1:hello world
なんてやると出来たような気がするが、、、
実はこれだと$2以降がわたらない。

はっきりいって、渡す方法を見つけたら、
チューリング賞物じゃないかな?え?無理?

思い返すとperlの黎明期には、perlなら長年shでは不可能だった
これができるって宣伝を見た覚えがあるし、shじゃ無理ちゃうかな。
0016名無しさん@お腹いっぱい。2006/01/21(土) 22:33:23
>>15
無理ですね。
0017152006/01/21(土) 22:43:30
>16
そんなに簡単に気って捨てるなよ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
>>17
惜しいが、それだと引数の中に
普通の文字としてシングルクォートがある場合にうまくいかない。

set " hoge isn't hage " " No, I don't. "

みたいな場合ね。
0020名無しさん@お腹いっぱい。2006/01/21(土) 22:58:41
echo 'echo "$@"' | sh /dev/stdin a b c
とか。
0021名無しさん@お腹いっぱい。2006/01/21(土) 22:59:51
>>19
今思い付いたが、引数の"とか'とか怪しい文字を全部エスケープし
てしまえばいいのか。
0022名無しさん@お腹いっぱい。2006/01/21(土) 23:03:43
>>13
切り返したつもりなんだろうが、一番分かってないのはお前のようだぞw

#このスレは幼稚なやつがいぱ〜いだね。
0023名無しさん@お腹いっぱい。2006/01/22(日) 02:55:30
/home/user1/sample1.txtがオーナーroot、グループroot
/home/user2/sample2.txtがオーナーroot、グループroot

このとき一発でsample1.txtのオーナー・グループを user1に、
sample2.txtのオーナー・グループをuser2にするシェル記述法を教えてもらえないでしょうか?
宜しくお願いしますm(_ _)m
0024名無しさん@お腹いっぱい。2006/01/22(日) 03:18:47
id=$(expr "$file" : "/home/\([^/][^/]*\)/.*")
chown $id:$id $file # chown $id.$id $file
0025232006/01/22(日) 03:34:04
>>24
ありがとうございます、
上の文は正規表現ですよね、
下の#はなんでしょうか、コメントアウトじゃないですよね。
0026名無しさん@お腹いっぱい。2006/01/22(日) 03:38:10
┐(´ー`)┌
0027名無しさん@お腹いっぱい。2006/01/22(日) 07:50:22
コメントアウトじゃない?
0028名無しさん@お腹いっぱい。2006/01/22(日) 07:54:00
コメントアウトって
コメント記号で本文からはずしてコメント化するってこと?
あるいはコメントしてあるところのコメントを除去して非コメント化すること?
0029名無しさん@お腹いっぱい。2006/01/22(日) 09:01:11
コメント化する方。
0030名無しさん@お腹いっぱい。2006/01/22(日) 12:49:30
>>28
ときどき勘違いしている人がいるよね。
0031名無しさん@お腹いっぱい。2006/01/22(日) 13:01:47
コメントアウトしてあったものを本文に戻すことを
一語で表す表現ってあったっけ? 餡こめんと?
0032名無しさん@お腹いっぱい。2006/01/22(日) 13:02:30
コメント解除
0033名無しさん@お腹いっぱい。2006/01/22(日) 13:11:03
確実に通じる用語はないから
「行頭の # を削除」とか言った方がいい。
0034名無しさん@お腹いっぱい。2006/01/22(日) 13:27:14
「アンコメント」(uncomment)で一般的に世界中で通じる。
0035212006/01/22(日) 13:28:41
>>21
'とか"とかをエスケープするのではなくて、スペース類を全部エス
ケープすればいい。
0036名無しさん@お腹いっぱい。2006/01/22(日) 16:32:53
>>34
日本だとセクシャルハラスメント
0037名無しさん@お腹いっぱい。2006/01/22(日) 18:35:46
なぜ?
0038名無しさん@お腹いっぱい。2006/01/24(火) 00:15:54
指定したフォルダの中で一週間より古いファイルを削除するシェルって
どうやったらいいんでしょうか?

find . -mtime +7 -print | xargs rm
これだと、指定したフォルダの配下のフォルダも削除対象になっていまうので
指定したフォルダだけ検索するようにしたいのですがよい方法はありませんでしょうか?
0039名無しさん@お腹いっぱい。2006/01/24(火) 00:17:36
↓シェルに対するツッコミ
0040名無しさん@お腹いっぱい。2006/01/24(火) 00:22:43
>>38
シェルスクリプトについて、もう少しルシェルシェ (recherche) しましょう
0041名無しさん@お腹いっぱい。2006/01/24(火) 00:35:19
>>38
ls > ls.out でそのフォルダのファイル一覧を出力して
エクセルで編集してコピペ実行。
0042名無しさん@お腹いっぱい。2006/01/24(火) 01:33:23
>>38
findに「-type f」を入れれ。
0043名無しさん@お腹いっぱい。2006/01/24(火) 01:34:35
-depth n とみたが
0044名無しさん@お腹いっぱい。2006/01/24(火) 01:52:43
-maxdepth n とみたが
0045名無しさん@お腹いっぱい。2006/01/24(火) 03:45:43
↓-print に対するツッコミ
0046名無しさん@お腹いっぱい。2006/01/24(火) 07:07:39
>>45
突っ込みどころなのか?
昔のシステムに乗ってる find は -print 書かないと
何も出力しないんだが...
0047名無しさん@お腹いっぱい。2006/01/24(火) 07:35:50
以上、>>45へのツッコミですた

いや勉強になりますな
0048名無しさん@お腹いっぱい。2006/01/24(火) 07:42:41
>>38
シェルってゆうな、クズ。
0049名無しさん@お腹いっぱい。2006/01/24(火) 08:16:47
おそかったな
0050名無しさん@お腹いっぱい。2006/01/24(火) 08:34:39
おまえら、これを読んでおいてください。

The '#!'-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
>>38
危険だから xragsは使うな。
意図しないファイルが削除されたりするぞ。
0052名無しさん@お腹いっぱい。2006/01/24(火) 09:51:07
ふたたび-printについてのツッコミ
0053名無しさん@お腹いっぱい。2006/01/24(火) 13:34:27
-print0

xargsで意図しないファイルが消されるのって、ファイル名の問題以外は、
-execでも同様な気がするんだけど、違うの?
0054名無しさん@お腹いっぱい。2006/01/24(火) 14:19:13
>>53
>ファイル名の問題以外は、
重要な問題を「以外」で片付けるなよ。
0055名無しさん@お腹いっぱい。2006/01/24(火) 14:43:17
次スレ用xargsテンプレ募集
0056名無しさん@お腹いっぱい。2006/01/24(火) 15:11:38
>>53
というか、意図しないファイルが削除されたりしない!
0057名無しさん@お腹いっぱい。2006/01/24(火) 15:33:14
>>55
xargsには、スペース、シングルクォート、ダブルクォート、改行などを含む
ファイル名を正しく処理できないという仕様バグがあります。
(例: 「I'm a girl.mp3」などというファイル名はイマドキ結構ある)
これを回避する唯一の方法は、findの -print0オプションと xragsの-0オプションを
組み合わせて使用することです。しかし、Solarisのfind/xargsには
これらのオプションがないため、移植性重視のシェルスクリプトでは結局、
xargsを使用しないのが懸命です。
0058名無しさん@お腹いっぱい。2006/01/24(火) 16:28:43
- Solarisのfind/xargsにはこれらのオプションがないため、
+ これらは GNU coreutils の拡張オプションであるため、

じゃね?GNU 以外で -print0, -0 のある実装ってあるの?
0059名無しさん@お腹いっぱい。2006/01/24(火) 16:34:22
> xargsを使用しないのが懸命です。
必死だなw
0060名無しさん@お腹いっぱい。2006/01/24(火) 16:36:45
>>57
HPUXに -0 ってついてますか?
0061名無しさん@お腹いっぱい。2006/01/24(火) 17:51:25
>>57
それが唯一の方法は言い過ぎだろう。
-execを使うという手もある。xargsの出番はなくなるけど。

0062名無しさん@お腹いっぱい。2006/01/24(火) 18:06:21
>>58
GNU coreutilsじゃなくて GNU findutils。

あと、FreeBSDの find xargsは GNUではないけど -print0 -0 が使える。
0063名無しさん@お腹いっぱい。2006/01/24(火) 18:39:18
-execって毎回プロセス起こすんじゃないの?
それがなければxargs使わないけど。
0064名無しさん@お腹いっぱい。2006/01/24(火) 18:44:59
>>38
検索結果のリストを編集汁る。
0065名無しさん@お腹いっぱい。2006/01/24(火) 19:32:28
>>57
> Solarisのfind/xargsにはこれらのオプションがないため、

あります。
0066名無しさん@お腹いっぱい。2006/01/24(火) 19:37:27
つまり移植性的にも問題無いって事か
テンプレ?
0067名無しさん@お腹いっぱい。2006/01/24(火) 21:12:37
>>65
それいつから?
すくなくとも, 現場で稼働してる
% uname -a
SunOS ns11 5.9 Generic_112233-06 sun4u sparc SUNW,UltraAX-i2
な, マシンでは使えないんだが...
0068名無しさん@お腹いっぱい。2006/01/24(火) 21:41:24
>>65
なんてオプション?
0069名無しさん@お腹いっぱい。2006/01/24(火) 21:58:07
>>65
Solaris 10でも無いよ。嘘はイカンよ。
0070名無しさん@お腹いっぱい。2006/01/25(水) 02:40:57
Solarisなんかに移植しようなんて考えなけりゃいいじゃん。
0071名無しさん@お腹いっぱい。2006/01/25(水) 12:27:16
えっとtgzファイルのgrep検索なんですが、
tar Ozxf hoge.tgz | grep arekore
とかやってもどのファイルにあったか分からないんで困ってます。
そりゃファイルを展開すればいいけど、また削除するのが面倒です。
tarのオプション`O'はファイルを作らないでSTDINに出してくれるので
これとシェルスクリプトの何か使ってファイル名と行数を出してくれる
ようなことできないでしょうか。

0072名無しさん@お腹いっぱい。2006/01/25(水) 12:34:20
ディレクトリ作って展開してgrepしてディレクトリごと消すスクリプトじゃだめなん?
■ このスレッドは過去ログ倉庫に格納されています