トップページunix
987コメント345KB

シェルスクリプト総合 その13

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0002名無しさん@お腹いっぱい。2008/10/16(木) 00:54:18
□過去スレ:
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
シェルスクリプト総合 その11
http://pc11.2ch.net/test/read.cgi/unix/1211284684/
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
シェルスクリプト総合 その9
http://pc11.2ch.net/test/read.cgi/unix/1187130302/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
シェルスクリプト総合 その7
http://pc11.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc11.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc11.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc11.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc11.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc11.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc11.2ch.net/test/read.cgi/unix/1101820646/
0003名無しさん@お腹いっぱい。2008/10/16(木) 00:56:27
□関連スレ:
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc11.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc11.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc11.2ch.net/test/read.cgi/unix/1102921590/
0004/bin/sh2008/10/16(木) 00:58:36
純正シェルが2ゲット
0005名無しさん@お腹いっぱい。2008/10/16(木) 01:01:30
□初心者向けリンク
「誰にでも」シリーズ
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/
0006名無しさん@お腹いっぱい。2008/10/16(木) 01:02:52
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html

□最近のシェルスクリプト本(1)

(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/
0007名無しさん@お腹いっぱい。2008/10/16(木) 01:03:42
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
0008名無しさん@お腹いっぱい。2008/10/16(木) 01:06:02
□関連書籍と関連リンク:

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/
0009名無しさん@お腹いっぱい。2008/10/16(木) 01:06:58
□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
0010名無しさん@お腹いっぱい。2008/10/16(木) 04:18:20
v7うんぬんはどうなったんだ?
0011名無しさん@お腹いっぱい。2008/10/16(木) 07:06:51
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
0012名無しさん@お腹いっぱい。2008/10/16(木) 09:35:20
>>1
追加

FreeBSDユーザは/bin/shの正体がashなので注意。

v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
0013名無しさん@お腹いっぱい。2008/10/16(木) 10:49:58
偏屈じじいの繰り言 総合 その13

に改名したらどうだ。スレタイ。
0014名無しさん@お腹いっぱい。2008/10/17(金) 00:29:51
>>1
echo 乙 > /dev/null
0015名無しさん@お腹いっぱい。2008/10/17(金) 00:44:25
echo $'\344\271\231'
0016名無しさん@お腹いっぱい。2008/10/17(金) 00:49:17
Solarisなんて使わないからどうでもいい
0017名無しさん@お腹いっぱい。2008/10/17(金) 00:52:09
solarisでないunixとは?
0018名無しさん@お腹いっぱい。2008/10/17(金) 10:20:48
>>17
SCO OpenServer
0019名無しさん@お腹いっぱい。2008/10/18(土) 01:55:15
grep の戻り値で疑問なんすけど

grep -v でも引数の文字列が存在すれば0、存在しなければ1に見えます。

でも
ps -ef | grep hoge | grep -v grep

のときプロセスhogeが存在すれば、0存在しなければ1を返すのはなぜでしょう?

そのリターンを返してるはずの最後の grep -v grep ではは毎回
文字列"grep"がひっかかってると思うんですけど・・・

0020名無しさん@お腹いっぱい。2008/10/18(土) 02:11:44
$ echo grep | grep -v grep; echo $?
1 # grep以外の行はないよ
$ (echo grep; echo foo) | grep -v grep; echo $?
foo
0 # grep以外の行があったよ

要するに-vの時に「ヒットする」のは"grep"にマッチ「しない」行。
0021名無しさん@お腹いっぱい。2008/10/18(土) 08:58:28
psの結果をgrepするのはお勧めしない。
関係ない文字列にマッチする可能性とかがあるから。

pgrep使え。
0022名無しさん@お腹いっぱい。2008/10/18(土) 10:01:59
>>20
理解しました!
0023名無しさん@お腹いっぱい。2008/10/18(土) 10:11:28
>>22
>>21 は理解しないのかよw
0024名無しさん@お腹いっぱい。2008/10/18(土) 10:29:35
質問は-vオプション指定時の終了ステータスに関するものだから。
>>19の頭に「grep の戻り値で疑問なんすけど」と書いてある。

>>21は知識をひけらかしたくてしょうがない中二病。
0025名無しさん@お腹いっぱい。2008/10/18(土) 10:33:36
>>24
それは手段であって、目的ではないことはエスパーすればわかる。

前スレで、command1 | command2 とやった時、
command2の終了ステータスのみが反映されますよね? と聞いてた人と
同一人物だということも、エスパーすればわかる。
0026名無しさん@お腹いっぱい。2008/10/18(土) 10:35:03
>>21くらいの書き方ならセーフだろ。
0027名無しさん@お腹いっぱい。2008/10/18(土) 10:35:34
>>25はアウト
0028名無しさん@お腹いっぱい。2008/10/18(土) 10:45:18
エスパーは隔離スレに引っ込んでいなさい。
0029名無しさん@お腹いっぱい。2008/10/18(土) 10:59:50
psに限らず、human readableを意図したコマンドの出力をgrepするのって間抜けだよなぁ。
ls -l とかもね。
0030名無しさん@お腹いっぱい。2008/10/18(土) 11:08:58
人が見るためにgrepするのは問題ない。むしろ普通。
0031名無しさん@お腹いっぱい。2008/10/18(土) 11:11:49
$?を得るのが目的なら、人が見るためじゃないしなぁ
0032名無しさん@お腹いっぱい。2008/10/18(土) 11:59:18
psは出力書式が指定できるから、
どっちかというと扱いやすい方。
0033名無しさん@お腹いっぱい。2008/10/18(土) 13:17:07
ps -ef | grep [h]oge
0034名無しさん@お腹いっぱい。2008/10/18(土) 13:25:53
>>33
これはあたまいいっすね
0035名無しさん@お腹いっぱい。2008/10/18(土) 13:27:47
>>33
アフォか。vi hogeとかに引っかかる。
0036名無しさん@お腹いっぱい。2008/10/19(日) 08:06:41
まあそうだけど。
pgrepが無い環境は私の周りにはほとんど無いから、pgrep使ってるよ。
0037名無しさん@お腹いっぱい。2008/10/20(月) 21:13:59
sed についてですが、/を含むファイルを d で削除する場合、
デリミタを : に変更して対処する方法がありますでしょうか。

sed ':/usr/local/hoge:d' hoge.txt のように処理したいのですが、
デリミタの変更は s や y の無い構文では変更できなくて苦悩中です。

sed 's:dummy:dummy:; :/home/hoge.txt:d' hoge とやれば処理可能です。

やりたい事は、sed 's:/usr/local/hoge::' で文字列を削除しても
改行が残ってしまうので、改行まで削除したいと思っています。

何か良案ありませんでしょうか。
0038名無しさん@お腹いっぱい。2008/10/20(月) 21:21:37
GNU sed なら man に書いてある。
他なら知らん。
0039名無しさん@お腹いっぱい。2008/10/20(月) 21:23:52
sed -e '\:/usr/local/hoge:d'
POSIXにもある
0040名無しさん@お腹いっぱい。2008/10/20(月) 21:29:44
findでファイルリスト取りたいんですが
ファイルタイプ dとかfとかlとか出せないですかね?
0041名無しさん@お腹いっぱい。2008/10/20(月) 21:34:17
なんだって?
0042名無しさん@お腹いっぱい。2008/10/20(月) 21:49:26
find -type d -exec echo d {} \; -or \
-type f -exec echo f {} \; -or \
(省略)
っていう糞みたいな案が思いついた
0043名無しさん@お腹いっぱい。2008/10/20(月) 21:52:40
findのprintfで
名前,ユーザ,タイムスタンプ,権限,リンクならリンク先,ディレクトリとかファイルとかリンクとかの種類

みたいな感じのCSVを出力したいわけですよ
しかしファイルタイプの取り方が分からず
あとリンク切れだったら教えて欲しいですね
0044名無しさん@お腹いっぱい。2008/10/20(月) 21:54:43
>>40
GNU findなら、

find /dir -printf '%y %f?n'
0045名無しさん@お腹いっぱい。2008/10/20(月) 22:26:05
>>38
man に記載がありましたか。失礼しました...

>>39
ありがとうございます。
試してみます。
0046名無しさん@お腹いっぱい。2008/10/20(月) 22:26:59
     _, / ̄⌒i⌒ ̄\___
   /  /.;  ; .  | .;   ヘ ;`i
  / .;   ,;   . .; |  .;   .; .; i
  ヽ._/ . .; .; .; |   .;  ヾ_/   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    i´  .  ;   | .;   .; `i    | 
    `x ,. _ヽ | /----x'=-+   | 純正 find でヨロ
    | 6〉,/  。i._|_|/。 `ヽ,| #l)   | 
   └-ヽ;ー‐'__└---===-┘  <  
   c==<< ̄ ̄ ̄ ̄>>.===o゛   \_________
      /  ヾ二二//ゝ、         ___, ----―
 ̄i⌒/´   ヾ  ̄ ̄/   `i⌒ヽー、 ̄ ̄|    |     |
  ヽ ゝー─---、_/---─ノ  ノ  |   |    |  _ -‐
0047名無しさん@お腹いっぱい。2008/10/20(月) 22:39:14
-exec ls -dF {} \;
あたりで、出力をsedかawkで加工。
0048名無しさん@お腹いっぱい。2008/10/20(月) 22:48:43
>>43みたいな要求なら
-exec ls -dl {} \; -exec ls -dlL {} \; して、
比較とか含めてawkあたりで加工するしかなさそうね
0049名無しさん@お腹いっぱい。2008/10/20(月) 23:15:17
perl(python, ruby)を避ける理由はない。
0050名無しさん@お腹いっぱい。2008/10/20(月) 23:31:41
ありがとうございます。

今は手元のLinuxのGNU findでしか試せてないんですが、
>>44の%yでf,d,lとかが取れるのはありがたいですね

実際に動かしたいのはsolaris(詳細は忘れた)も混ざってるので、使えないのかもしれませんが。

使えなかったら>>42>>47>>48を参考に-exec ls加工でやりたいと思います。

ちなみにリンク切れというのはGNU findでも検知できないんでしょうか?
0051名無しさん@お腹いっぱい。2008/10/21(火) 07:48:01
日本語化されてるんだからマニュアル読みなよw
あと「検知」した後どうしたいのか書いた方がいい。
0052名無しさん@お腹いっぱい。2008/10/21(火) 10:20:21
sortコマンドでドメイン名を整列したいのですが、

bbb.example.com
aaa.example.com
example.com
example.co.jp



example.com
aaa.example.com
bbb.example.com
example.co.jp

のようなことは出来ますか?
ピリオドを区切り文字にして、右側のフィールドから順に評価してくれればイイのですが。
0053名無しさん@お腹いっぱい。2008/10/21(火) 10:31:35
>>52
Perl か何かで書いちゃえば?
http://d.hatena.ne.jp/peanutsjamjam/20080108
0054名無しさん@お腹いっぱい。2008/10/21(火) 11:41:03
>>53
> http://d.hatena.ne.jp/peanutsjamjam/20080108
ここの例だと、ハイフンがあると破綻するな。
0055名無しさん@お腹いっぱい。2008/10/21(火) 21:43:35
>>52
awk -F. '{ for (i=NF; i>0 ; i--) { printf("%s ", $i) }; print("") }' | sort | awk '{ for (i=NF; i>0 ; i--) { printf("%s.", $i) }; print("") }' | sed 's/\.$//'
0056名無しさん@お腹いっぱい。2008/10/21(火) 22:04:40
sort -i にした方がたぶん目的にはかなってるとおも
0057名無しさん@お腹いっぱい。2008/10/22(水) 11:02:44
rev | sort | rev
0058522008/10/22(水) 11:13:00
みなさま、どうも有り難うございます。
sortコマンドだけでは無理っぽいので、>>55さんの方法でやることにします。
"sort --sort=domainname"とか出来ればイイのですが。

>>56
> sort -i にした方がたぶん目的にはかなってるとおも
???GNUのsortだと -i は印刷不可能な文字を無視するだけのようです。
0059名無しさん@お腹いっぱい。2008/10/22(水) 13:16:57
すまぬ、-f だ
0060552008/10/23(木) 12:03:26
>>58
> "sort --sort=domainname"とか出来ればイイのですが。

コマンドを組み合わせてやっつけるのがシェルスクリプトの妙味ですので。
特殊な処理をコマンドに埋め込み始めるときりがないので。
0061名無しさん@お腹いっぱい。2008/10/23(木) 12:29:04
なんでもかんでも無理にシェルでやろうとせずに、awkとかperlとかrubyとか使えば簡単なのに。
0062名無しさん@お腹いっぱい。2008/10/23(木) 12:41:48
>>61
スレタイ読めよ
0063名無しさん@お腹いっぱい。2008/10/23(木) 13:22:17
>>1読めよ
0064名無しさん@お腹いっぱい。2008/10/23(木) 13:38:55
>>52をsh抜いてawk, perl, ruby, pythonだけで書くと>>55より簡潔に書ける?
sortの行指向をうまく利用しているからかなり簡潔になってるよ。
0065名無しさん@お腹いっぱい。2008/10/23(木) 14:45:30
#!/usr/bin/python
import sys
def sort_key(line):
    L = line.split('.')
    L.reverse()
    return L
for line in sorted(sys.stdin, key=sort_key):
    sys.stdout.write(line)
0066名無しさん@お腹いっぱい。2008/10/23(木) 15:17:58
puts ARGF.readlines.sort_by {|x| x.split(".").reverse}
0067名無しさん@お腹いっぱい。2008/10/23(木) 16:45:59
だからcase insensitiveでソートしろと。
0068名無しさん@お腹いっぱい。2008/10/23(木) 17:01:13
>>65
> L = line.split('.')
< L = line.lower().split('.')
0069名無しさん@お腹いっぱい。2008/10/23(木) 17:06:27
>>66
> 〜 x.split(〜
< 〜 x.downcase.split(〜

以上スレ違い話終了
0070名無しさん@お腹いっぱい。2008/10/24(金) 02:17:58
sort -n に対応する事をスクリプト言語でする時はどうするんかいな
■ このスレッドは過去ログ倉庫に格納されています