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

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

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

前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0002名無しさん@お腹いっぱい。2007/08/15(水) 07:25:49
□前スレや過去スレ:
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc10.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc10.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc10.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc10.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc10.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc10.2ch.net/test/read.cgi/unix/1101820646/

□関連スレ:
sed
http://pc10.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc10.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc10.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc10.2ch.net/test/read.cgi/unix/1102921590/
0003名無しさん@お腹いっぱい。2007/08/15(水) 07:27:17
□初心者向けリンク
「誰にでも」シリーズ
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名無しさん@お腹いっぱい。2007/08/15(水) 07:28:56
□最近のシェルスクリプト本(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/
0005名無しさん@お腹いっぱい。2007/08/15(水) 07:30:05
□最近のシェルスクリプト本(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/
0006名無しさん@お腹いっぱい。2007/08/15(水) 07:30:56
□関連書籍と関連リンク:

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/

□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,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名無しさん@お腹いっぱい。2007/08/15(水) 09:20:11
>>1
0008名無しさん@お腹いっぱい。2007/08/15(水) 09:34:03
1乙
0009名無しさん@お腹いっぱい。2007/08/15(水) 13:53:05
乙一
0010名無しさん@お腹いっぱい。2007/08/15(水) 13:57:07
関連スレ(bashの話題はこちらへ)

シェルスクリプト総合@LINUX Part3
http://pc11.2ch.net/test/read.cgi/linux/1184077033/l50
0011名無しさん@お腹いっぱい。2007/08/18(土) 13:14:39
あち
0012名無しさん@お腹いっぱい。2007/08/18(土) 20:14:08
そち
0013名無しさん@お腹いっぱい。2007/08/18(土) 22:19:20
前任者から引き継いだスクリプトが結構多数あります。
そこでは、ファイル名を扱う変数が $file みたいにクオートなしで書かれていて、
昔はこれで問題なかったようですが、今はとくにSambaの公開ディレクトリなどで
エラーというか、正常に動作しない事態が起きまくります。
そこで、ひとつずつ、$file を "$file" に書き直すとかしてますが、
それを一発で解決できる方法ないですか?
0014名無しさん@お腹いっぱい。2007/08/19(日) 16:46:11
とはいってもクオートの中で使われているのもあるだろうし、
sedでというのも難しそうな。
とりあえずは#!/bin/shになってるのをzshにしてしまうのが楽かも。
zshはクオートされてなくても分割されないから。
0015名無しさん@お腹いっぱい。2007/08/22(水) 00:53:34
"結構多数"にもよるけれど、エディタかスクリプトで
インタラクティブに置換するのが簡単かと。
でもこのスレ的に求められている答えではないか
0016名無しさん@お腹いっぱい。2007/08/24(金) 10:23:23
「if〜then」の中で「hoo」という変数名を使っていたら「if〜then」までを出力したい。
どうやればできる?

0017名無しさん@お腹いっぱい。2007/08/24(金) 10:27:20
>>16
変数hooが、空文字列の場合でも「設定されていない」とみなしていいなら、

if [ "$hoo" ]; then
0018名無しさん@お腹いっぱい。2007/08/24(金) 10:36:00
質問の意味が複数にとれるなぁ、

grep '\<if\>.*\<hoo\>.*\<then\>'

ということじゃないかと。だとするとスレ違いだが。
0019名無しさん@お腹いっぱい。2007/08/24(金) 12:57:04
>>18

複数行にわたる場合も有るし、
if以前とthen以降は出力しないんだから、
sedとかの方がふさわしいと思う。
0020名無しさん@お腹いっぱい。2007/08/24(金) 13:03:24
で、>>16はほんとは何をしたいのよ。
0021名無しさん@お腹いっぱい。2007/08/24(金) 16:09:42
楽にログローテーションするコマンドありますか

イメージ
xxcmd | ローテーションコマンド サイズ 世代 ファイル名

xxcmdはfdをオープンしたまま書き出すので、loglotationではNGです。


いいのありますかね?
0022名無しさん@お腹いっぱい。2007/08/24(金) 16:13:05
>>21
rotatelogs
0023名無しさん@お腹いっぱい。2007/08/24(金) 16:38:19
>>22
ありがとうございます。
あやうく、Log4Perl を選びそうになりました。
0024名無しさん@お腹いっぱい。2007/08/25(土) 00:45:19
ちょっと変な聞き方になりますが

root権限で実行しているシェルスクリプト内で実行するコマンドはroot権限で実行されるはず。
例えば、
--------------
#!/bin/sh
whoami
exit 0
--------------
をsudoで実行したらwhoamiはrootを返すはず。

以上の認識は間違ってないですよね?

というのは、とある開発中のUNIXでwhoamiがログインユーザ名を返してきました。
これをバグであると捉えていいのか迷ったので。
0025名無しさん@お腹いっぱい。2007/08/25(土) 01:16:25
いや、バグじゃないと思う。

root権限で動いていなけりゃバグと言えるが、whoami云々はまた別の話。
0026242007/08/25(土) 02:26:53
あ、whoamiがrootを返さなくなったのはwhoamiの動作変更かもしれないですからね。
例えとして悪かったですね。
whoami以外の何かを呼んでも、それらはroot権限で動いていませんでした。

気になっているのは、「シェルスクリプトそれ自体がroot権限で動いていれば、
そこから呼び出すコマンドもまたroot権限で動くはず」
と考えていた僕は間違っていたのか?ということです。
0027名無しさん@お腹いっぱい。2007/08/25(土) 02:43:35
>>26
その考えは正しい。

% echo Hello > /tmp/hoge
% sudo chown root /tmp/hoge
Password:
% sudo chmod 400 /tmp/hoge
% ls -l /tmp/hoge
-r-------- 1 root wheel 6 Aug 25 02:37 /tmp/hoge
% cat /tmp/hoge
cat: /tmp/hoge: Permission denied
% sudo cat /tmp/hoge
Hello
% echo "cat /tmp/hoge" > /tmp/test.sh
% sh /tmp/test.sh
cat: /tmp/hoge: Permission denied
% sudo sh /tmp/test.sh
Hello

って、Macで試したんだが、ちゃんとroot権限で動いてる。
0028名無しさん@お腹いっぱい。2007/08/25(土) 07:12:42
>>27
行の左端に書いてある % はなんの意味があるのですか?
0029272007/08/25(土) 12:05:07
>>28
% はプロンプトです。$ の方が良かったかな。

>>whoami以外の何かを呼んでも、それらはroot権限で動いていませんでした
というのが間違っているんじゃないかと思う。
その確認をしてみたのが >>27
0030名無しさん@お腹いっぱい。2007/08/25(土) 12:25:15
rootでじゃなくしつこくroot権限でと書いているのだよな。
シェルスクリプトにsetuidしたつもりとかいうオチじゃないだろうな。
0031162007/08/25(土) 22:36:45
徹夜続きで来れなかった。
遅れてスマソ。
こんな感じでできるかな?と自分で書いてみた↓

awk '/if/,/then/{print $0}' input.file|sed -n '/then/{\
x\
s/\n/\t/g\
/hoo/p\
d\
}\
H'
003224,262007/08/26(日) 02:11:24
よくよく考えてみれば、スクリプト内で呼び出すコマンドもroot権限で動いてくれないと
root権限で動かす意味がないですよね。

で、バグじゃねーかと開発者に報告しようと思っていたところ、
その開発中UNIXの最新ビルドが出て、改めて確認してみたら、
スクリプト内で呼び出すコマンドはroot権限で動くようになっておりました
(whoamiもrootを返すようになっていました)。やはりバグだったようです。

レス下さった方ありがとうございました。
0033名無しさん@お腹いっぱい。2007/08/29(水) 23:50:27
Solaris8上でcshスクリプト使っているのですが、

rm *.log

としたときに*.logが存在しなかった時に表示される
「一致しませんでした」というメッセージを抑止するには
どうしたらいいのでしょうか?
0034名無しさん@お腹いっぱい。2007/08/30(木) 00:21:33
set nonomatch
0035名無しさん@お腹いっぱい。2007/08/30(木) 00:49:08
あるファイルの最後から指定した行数だけ表示しない、
ということをしたいのですが、どのようにすればよいでしょうか?

ファイルの内容
-----------------------
aaa
bbb
ccc
ddd
eee
-----------------------

表示したい内容(最後から二行だけ表示しない)
-----------------------
aaa
bbb
ccc
-----------------------

よろしくご教授お願いします。
0036名無しさん@お腹いっぱい。2007/08/30(木) 01:30:00
誤字等の館:ご教授願います
http://www.tt.rim.or.jp/~rudyard/torii009.html
0037名無しさん@お腹いっぱい。2007/08/30(木) 01:31:47
なんか久しぶりにそれらしい質問を見た気がする。

>>35
linux板の方のスレに以前書いたけど、たとえば末尾3行を落とすなら
sed -e '1h;1!H;1,3!{g;P;s/[^\n]*\n//;h;};d' file
行数に合わせて3を適当に変更してくれ。

tailに-rオプションがある一部の環境なら
(tail -r|sed 1,3d|tail -r) < file
というのもできる。ファイルを2回ひっくり返すからかなり計算機の無駄遣いだけど。
■ このスレッドは過去ログ倉庫に格納されています