シェルスクリプト総合 その7
■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル
2006/09/07(木) 13:00:11スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0002ミスターシェル
2006/09/07(木) 13:01:14シェルスクリプト総合 その6
http://pc8.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc8.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その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/
□関連スレ:
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 Part2【awk】
http://pc8.2ch.net/test/read.cgi/linux/1154578200/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0003ミスターシェル
2006/09/07(木) 13:02:10「誰にでも」シリーズ
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/
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
0004ミスターシェル
2006/09/07(木) 13:03:23(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/
0005ミスターシェル
2006/09/07(木) 13:06:03FreeBSD 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/
0006ミスターシェル
2006/09/07(木) 13:07:12・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,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
テンプレは以上です。引き続きよろしくお願いします。
0007名無しさん@お腹いっぱい。
2006/09/07(木) 13:11:37スレ立て乙です。
0008名無しさん@お腹いっぱい。
2006/09/07(木) 15:48:220009質問
2006/09/07(木) 17:25:28awkの中で変数を使いたいんですが出来ません。
例えば
#!/bin/sh
a=xyz
awk '/^${a}/{print $2}' abc
行き詰まってしましました。
解決策を教えてください。
0010名無しさん@お腹いっぱい。
2006/09/07(木) 17:36:00awk '/^'"${a}"'/{print '"$2"'}' abc
0011名無しさん@お腹いっぱい。
2006/09/07(木) 17:38:38$2 は awk側の変数だろ。
awk '/^'"${a}"'/{print $2}' abc
0012名無しさん@お腹いっぱい。
2006/09/07(木) 17:48:58せっかくシェルスレなんだからawk何か使わずに
シェルだけでやれ。
↓
#!/bin/sh
a=xyz
while read f1 f2 f3
do
case "$f1" in
"$a"*) echo "$f2";;
esac
done < abc
0013名無しさん@お腹いっぱい。
2006/09/08(金) 01:47:20前スレから見てるけど、改良や改善などの挙げ句どのみち何らかの
スクリプト言語になっちまうのは、避けられない宿命っぽいよ。
0014名無しさん@お腹いっぱい。
2006/09/08(金) 01:57:380015名無しさん@お腹いっぱい。
2006/09/08(金) 03:53:420016名無しさん@お腹いっぱい。
2006/09/08(金) 16:10:480017名無しさん@お腹いっぱい。
2006/09/08(金) 16:20:30つながりがよくわからんが、Solarisにはwhoamiコマンドが無かった希ガス。
0018名無しさん@お腹いっぱい。
2006/09/08(金) 16:30:260019名無しさん@お腹いっぱい。
2006/09/08(金) 16:33:490020名無しさん@お腹いっぱい。
2006/09/08(金) 16:47:140021名無しさん@お腹いっぱい。
2006/09/08(金) 17:22:090022名無しさん@お腹いっぱい。
2006/09/08(金) 17:35:35whoamiは
sunOS 5.7には無かった
sunOS 5.9には有った
who am i
はどちらでも使える。
5.8は使ってないからわからん。
0023名無しさん@お腹いっぱい。
2006/09/08(金) 17:38:02su して who am i しても、su前の一般ユーザーが表示されるはず。
0024名無しさん@お腹いっぱい。
2006/09/08(金) 17:43:54いや それはもちろんわかってるって w
ネタとして遊んで欲しかった・・・
0025名無しさん@お腹いっぱい。
2006/09/08(金) 18:38:36ps u | awk '$2 == '`echo $$`' {print $1}'
0026名無しさん@お腹いっぱい。
2006/09/08(金) 18:40:35echoが無駄です。$$ だけで桶。
0027名無しさん@お腹いっぱい。
2006/09/08(金) 18:46:46↓
ps u | while read f1 f2 f3; do case $$ in $f2) echo "$f1";; esac; done
0028名無しさん@お腹いっぱい。
2006/09/08(金) 18:53:120029名無しさん@お腹いっぱい。
2006/09/08(金) 18:56:28ps -h -o user $$
0030名無しさん@お腹いっぱい。
2006/09/09(土) 09:42:37それ処理系依存。Solarisじゃだめだった。
0031名無しさん@お腹いっぱい。
2006/09/09(土) 10:56:05↓
getent passwd `id -u` | (IFS=: read user other; echo $user)
まあ、id -unが使えれば一発なんだが、Solarisだと使えないし。
0032名無しさん@お腹いっぱい。
2006/09/09(土) 11:02:18Solarisは id -u も使えないよ。結局 >>28 か?
0033名無しさん@お腹いっぱい。
2006/09/09(土) 11:10:32id | (IFS='()' read f1 f2 f3; echo $f2)
0034名無しさん@お腹いっぱい。
2006/09/09(土) 11:24:30/usr/xpg4/bin/id -u
0035名無しさん@お腹いっぱい。
2006/09/09(土) 11:53:15絶対PATHを決めうちすると今度はSolaris以外で動かない。
psもポータブルじゃないし、
最もポータブルなのは >>33 か?
0036名無しさん@お腹いっぱい。
2006/09/09(土) 12:08:210037名無しさん@お腹いっぱい。
2006/09/09(土) 12:26:59だから、ps -o user というオプションが使えない psもあるんだって。
あと、Linuxの一部では tail -1 も使えない。tail -n 1 にしないと。
よって、>>33 が最もポータブル。
0038名無しさん@お腹いっぱい。
2006/09/09(土) 12:41:11マジかよ……。
たしかに引数の指定のしかたは現代的ではないけど、
過去に作られたスクリプトとの互換性とか移植性とかってのは考えないんだろうか。
0039名無しさん@お腹いっぱい。
2006/09/09(土) 12:58:55イヌックスのその辺りのコマンドは全部GNUじゃないの?
0040名無しさん@お腹いっぱい。
2006/09/09(土) 13:02:430041名無しさん@お腹いっぱい。
2006/09/09(土) 13:11:100042名無しさん@お腹いっぱい。
2006/09/09(土) 14:37:42あまりに不評で戻らなかったっけ?
一部のディストリビューションで独自にやってるのかな。
0043名無しさん@お腹いっぱい。
2006/09/09(土) 21:23:28シンボリックリンクの内容をポータブルに読むにはどうすればいい?
0044名無しさん@お腹いっぱい。
2006/09/10(日) 20:03:31ls -l "$file" | sed 's/.*-> //'
というような処理をしているのを見たことがあるけど、
当然lsの実装に依存するしファイル名が->を含んでいたら終わり。
どうしても必要ならperlを呼ぶのが一番まし。
0045名無しさん@お腹いっぱい。
2006/09/11(月) 18:26:460046名無しさん@お腹いっぱい。
2006/09/11(月) 20:20:29もうかれこれ10回くらいこれでサーバーダウンしてます(T_T)
0047名無しさん@お腹いっぱい。
2006/09/11(月) 20:39:32dfもフォーマットがあんまりポータブルじゃないのでアレだが、
これでどうだ?
↓
while :
do
for i in `df -k /var`; do
case $i in
[89][0-9]%|100%) df -k /var | mail omae@example.jp;;
esac
done
sleep 60
done
でも、メール送っても根本的な解決にならないよ。
0048名無しさん@お腹いっぱい。
2006/09/11(月) 22:21:43そしてこれが /var を圧迫し、結局サーバが落ちるのだった。続く
0049名無しさん@お腹いっぱい。
2006/09/11(月) 22:45:43100%オーバーも考えたほうがいいと思う。
0050名無しさん@お腹いっぱい。
2006/09/11(月) 23:18:510051名無しさん@お腹いっぱい。
2006/09/13(水) 15:24:45xargs の -O とか find の -printOってオプションは
どういう動き?何のマニュアルなら載ってる?
AIXにものってないよ。
AIXとかソラリスにもないのに載せる必要
あるのか?
0052名無しさん@お腹いっぱい。
2006/09/13(水) 15:26:510053名無しさん@お腹いっぱい。
2006/09/13(水) 15:30:12じゃあ逆に聞くけど、(Sambaサーバとかで)「Program Files」みたいな
スペース入りのディレクトリorファイル名がバリバリに使われてる環境で、
正しく find | xargs するにはAIXではどうやってるの?
それとも問題に気づいてない?
0054名無しさん@お腹いっぱい。
2006/09/13(水) 17:42:03ttp://www.linux.or.jp/JM/html/GNU_findutils/man1/xargs.1.html
0055名無しさん@お腹いっぱい。
2006/09/14(木) 00:02:07Solarisのxargs(1)
入力データは行の集まりとして解析されます。引数は空白文字により 区切ら
れます。xargs を使って find dir -print や ls などのコマンドの出力を、
実行対象コマンドの入力とする場合、ファイル名に空白文字や復帰改行文字が
含まれていると、処理の結果は予測できません。これを防ぐには、見つかった
各ファイル名を引用符つきの文字列に変換するスクリプトを find を使って呼
び出し、そのスクリプトを xargs にパイプでつなげるようにしてください。
なお xargs が使う引用符の規則は、シェルの規則とは異なります。同じ規則
を採用しないのは、既存のアプリケーションが現状の規則に依存しているのに
対し、シェルの構文規則はそれと互換性を持たないためです。文字列を xargs
が正しく解釈できる形式に変換 する簡単な方法は、各文字の前にバックスラッ
シュ(\fR) を付加することです。
0056名無しさん@お腹いっぱい。
2006/09/14(木) 00:08:25SUSv3のxargs(1)
Note that input is parsed as lines; <blank>s separate arguments. If
xargs is used to bundle output of commands like find dir -print or ls
into commands to be executed, unexpected results are likely if any
filenames contain any <blank>s or <newline>s. This can be fixed by
using find to call a script that converts each file found into a
quoted string that is then piped to xargs.
0057名無しさん@お腹いっぱい。
2006/09/14(木) 00:26:42ファイル名:file_a
データ:
1,abc,b,c
2,def,e,f
3,ghi,h,i
これを先頭の数字次第で別ファイルに吐き出したいのですが、
#!/bin/sh
for REC in `cat file_a`
do
echo "$REC" >> record.dat
NUM=`cat record.dat | cut -d "," -f1`
case $NUM in
1) cut -f1- record.dat >> text1.txt ;;
2) cut -f1- record.dat >> test2.txt ;;
*) echo "error";;
esac
rm record.dat
done
--
forでfile_aを一行ずつ読んで、一時的にrecord.datに格納し、先頭の文字でcaseで振り分けるというやり方をして動かしています。
これで上記のデータであれば動くのですが、
データ:
1,a bc,b,c
2,def,e ,f
3,ghi,h,i
という風に半角スペースが入るとそこで改行と認識されるようで、一行単位で認識をしません。
何か良い方法はないかアドバイスをいただけないでしょうか。よろしくお願いします。
0058名無しさん@お腹いっぱい。
2006/09/14(木) 00:59:14for に与える引数リストが改行区切りだなんてどこに書いてあった?
行単位で認識されると思ってるのがまず勘違い。
改行区切りで欲しければ read を使う。
while read a; do
case "$a" in
1,*) echo "$a" >> text1.txt;;
2,*) echo "$a" >> text2.txt;;
*) echo error;;
esac
done < file_a
sed -n -e '/^1,/w text1.txt' -e '/^2,/w text2.txt' file_a
005957
2006/09/14(木) 01:43:28>for に与える引数リストが改行区切りだなんてどこに書いてあった?
>行単位で認識されると思ってるのがまず勘違い。
>改行区切りで欲しければ read を使う。
知りませんでした。
ありがとうございます、試させていただきます。
0060名無しさん@お腹いっぱい。
2006/09/14(木) 01:55:34区切り文字はIFSで設定する。
↓IFSを改行に設定
#!/bin/sh
IFS="
"
for rec in `cat file_a
echo $rec
done
■ このスレッドは過去ログ倉庫に格納されています