シェルスクリプト総合 その14
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2009/01/29(木) 06:54:48スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
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
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
0002名無しさん@お腹いっぱい。
2009/01/29(木) 06:55:25sed
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/
□初心者向けリンク
「誰にでも」シリーズ
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/
0003名無しさん@お腹いっぱい。
2009/01/29(木) 06:56:21UNIXの部屋 (沢山のコマンドの簡単な紹介など)
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/
0004名無しさん@お腹いっぱい。
2009/01/29(木) 06:57:24(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/
0005名無しさん@お腹いっぱい。
2009/01/29(木) 06:58:02FreeBSD 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
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
0006名無しさん@お腹いっぱい。
2009/01/29(木) 07:56:090007名無しさん@お腹いっぱい。
2009/01/29(木) 08:11:03シェルスクリプト総合 その13
http://pc11.2ch.net/test/read.cgi/unix/1224085718/
0008名無しさん@お腹いっぱい。
2009/01/29(木) 12:03:55freeコマンド相当のシェルを作りたいと思っています。
具体的にはどう書けばいいですか?
できれば、bashに依存せず、汎用シェルになるようにお願いします。
0009名無しさん@お腹いっぱい。
2009/01/29(木) 12:48:300010名無しさん@お腹いっぱい。
2009/01/29(木) 12:53:430011名無しさん@お腹いっぱい。
2009/01/29(木) 18:16:43busyboxというシェルが組み込みのfreeコマンドを持っています。
0012名無しさん@お腹いっぱい。
2009/01/29(木) 18:19:55そのbosyboxとかいうシェルを具体的に書いて下さい。
1行目は
#!/bin/shでお願いします。
2行目以降は?
0013名無しさん@お腹いっぱい。
2009/01/29(木) 18:43:090014名無しさん@お腹いっぱい。
2009/01/29(木) 18:44:53#!/bin/sh
busybox free
0015名無しさん@お腹いっぱい。
2009/01/29(木) 18:49:36#!/bin/sh
busybox free $*
0016名無しさん@お腹いっぱい。
2009/01/29(木) 18:52:52えっと、何か勘違いされてますか?
シェル名はなんでもいいんですが、bosyboxとして
$ cat bosybox
#!/bin/sh
この行をお願いします
この行をお願いします
この行をお願いします
:
$ ./bosybox
…実行結果…
ということですが、、
0017名無しさん@お腹いっぱい。
2009/01/29(木) 19:01:290018名無しさん@お腹いっぱい。
2009/01/29(木) 19:08:49なないかかんちがいてまちぇんでちゅか?
0019名無しさん@お腹いっぱい。
2009/01/29(木) 19:08:49$ cat busybox
#!/bin/sh
/bin/busybox $*
$./busybox free
...
0020名無しさん@お腹いっぱい。
2009/01/29(木) 19:16:00/bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。
0021名無しさん@お腹いっぱい。
2009/01/29(木) 19:17:55busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。
0022名無しさん@お腹いっぱい。
2009/01/29(木) 19:21:59busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)
よって失格。
0023名無しさん@お腹いっぱい。
2009/01/29(木) 19:24:23そうなのか。フォローthx
0024名無しさん@お腹いっぱい。
2009/01/29(木) 19:25:16無理
0025名無しさん@お腹いっぱい。
2009/01/30(金) 07:27:08一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには
どう書いたらいいですか?
0026名無しさん@お腹いっぱい。
2009/01/30(金) 07:35:41if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi
0027名無しさん@お腹いっぱい。
2009/01/30(金) 07:42:040028名無しさん@お腹いっぱい。
2009/01/30(金) 07:45:05>>25 「diffコマンドで」
0029名無しさん@お腹いっぱい。
2009/01/30(金) 07:50:34diff文が使えるようなシェルってあるんですか?
うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。
0030名無しさん@お腹いっぱい。
2009/01/30(金) 07:53:550031名無しさん@お腹いっぱい。
2009/01/30(金) 07:58:05comA
else
comB
fi
だろ?
0032名無しさん@お腹いっぱい。
2009/01/30(金) 10:12:430033名無しさん@お腹いっぱい。
2009/01/30(金) 10:58:24その [ ... ] が何を示すのか勉強しなおしてこい
0034名無しさん@お腹いっぱい。
2009/01/30(金) 16:59:25条件文を表してるのは知ってますよ
0035名無しさん@お腹いっぱい。
2009/01/30(金) 19:21:23[ ... ]っつー見かけに惑わされちゃいかん
0036名無しさん@お腹いっぱい。
2009/01/30(金) 22:19:18[: shell built-in command
/bin/[
0037名無しさん@お腹いっぱい。
2009/01/30(金) 22:32:562つのコマンド、commandA と commandB の標準出力同士を、
テンポラリファイルを作らずに diffコマンドで比較したい時、
bashなら、
diff <(commandA) <(commandB)
でできますが、
これを標準シェルでやるにはどうすればいいですか?
0038名無しさん@お腹いっぱい。
2009/01/30(金) 22:41:36commandA | (commandB | diff /dev/fd/3 -) 3<&0
0039名無しさん@お腹いっぱい。
2009/01/30(金) 22:42:34無理。
bash使うか、一旦ファイルに落せ。
0040名無しさん@お腹いっぱい。
2009/01/30(金) 22:47:410041名無しさん@お腹いっぱい。
2009/01/30(金) 22:57:08おおでけた。THX!
0042名無しさん@お腹いっぱい。
2009/01/30(金) 23:32:55その昔は、 /bin/[ なんてのが有ったんだがなぁ。
0043名無しさん@お腹いっぱい。
2009/01/30(金) 23:34:28今でもあるだろ
0044名無しさん@お腹いっぱい。
2009/01/30(金) 23:38:21今でもあるだろw
$ which '['
/usr/bin/[
0045名無しさん@お腹いっぱい。
2009/01/30(金) 23:50:580046名無しさん@お腹いっぱい。
2009/01/30(金) 23:52:10すまん、BSD育ちなんだw
0047名無しさん@お腹いっぱい。
2009/01/30(金) 23:59:24cshはaliasとかがあるせいでwhichを内部コマンドに持った。
0048名無しさん@お腹いっぱい。
2009/01/31(土) 07:29:55/dev/fd/3 って純正シェルでも使えるの??
0049名無しさん@お腹いっぱい。
2009/01/31(土) 13:15:290050名無しさん@お腹いっぱい。
2009/01/31(土) 13:41:51なんでもいいから、結局使えるの??
0051名無しさん@お腹いっぱい。
2009/01/31(土) 13:58:320052名無しさん@お腹いっぱい。
2009/01/31(土) 19:54:54いくらなんでもそんな質問しないもんね?
0053名無しさん@お腹いっぱい。
2009/01/31(土) 20:15:42あり得る。
例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに
シェルが /dev/stdoutという文字列を特別扱いして動作する。
そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと
考えることにも一定の合理性が認められる。
0054名無しさん@お腹いっぱい。
2009/01/31(土) 20:59:540055名無しさん@お腹いっぱい。
2009/02/01(日) 00:46:460056名無しさん@お腹いっぱい。
2009/02/01(日) 02:18:13面白い人が増えたなw
0057名無しさん@お腹いっぱい。
2009/02/01(日) 08:04:35/dev/fd/3 がシェルに依存してるのは本当だよ。
0058名無しさん@お腹いっぱい。
2009/02/01(日) 08:23:14man bash | less -p /dev/fd/fd
man zshmisc | less -p /dev/fd/n
if file is of the form `/dev/fd/n',
where n is an integer, then the test applied to the open file whose
descriptor number is n, even if the underlying system does not support
the /dev/fd directory.
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
0059名無しさん@お腹いっぱい。
2009/02/01(日) 22:53:380060名無しさん@お腹いっぱい。
2009/02/02(月) 04:47:50させるにはどのようにしたらいいですか?
0061名無しさん@お腹いっぱい。
2009/02/02(月) 06:25:59read
0062名無しさん@お腹いっぱい。
2009/02/02(月) 10:24:22bashの場合は read -n 1 の方がよりpauseの動作に近いかと
0063名無しさん@お腹いっぱい。
2009/02/02(月) 22:25:23質問欲嫁。それはpauseの動作。>>60 の質問はpuaseの動作。
0064名無しさん@お腹いっぱい。
2009/02/03(火) 00:09:20どう処理すればよいのでしょうか?
応答に対して入力する値(番号など)決まっているという前提でお願いします
0065名無しさん@お腹いっぱい。
2009/02/03(火) 00:12:580066名無しさん@お腹いっぱい。
2009/02/03(火) 00:25:53$ app
〜
$ exit
$ ttyplay x
006760
2009/02/03(火) 02:44:31>>61-62
read -n 1が良さそうなのでこれを使ってみます
>>63
すみません。タイプミスですorz
正しくは「pause」です
0068名無しさん@お腹いっぱい。
2009/02/03(火) 09:03:27expect
0069名無しさん@お腹いっぱい。
2009/02/03(火) 15:36:110070名無しさん@お腹いっぱい。
2009/02/05(木) 00:30:200071名無しさん@お腹いっぱい。
2009/02/05(木) 00:35:26conquerer -bj --creeping-deth
0072名無しさん@お腹いっぱい。
2009/02/05(木) 06:38:09多次元配列という意味なら、使えない。
0073名無しさん@お腹いっぱい。
2009/02/05(木) 18:40:06起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。
0074名無しさん@お腹いっぱい。
2009/02/05(木) 18:52:19実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。
0075名無しさん@お腹いっぱい。
2009/02/05(木) 18:53:41速い順に、
sh > perl > bash > python
で、大体合ってる
0076名無しさん@お腹いっぱい。
2009/02/05(木) 19:03:08perl, python > sh, bash だろ。JK
0077名無しさん@お腹いっぱい。
2009/02/05(木) 20:23:440078名無しさん@お腹いっぱい。
2009/02/06(金) 12:09:09http://www.commandlinefu.com/commands/browse
0079名無しさん@お腹いっぱい。
2009/02/06(金) 12:18:340080名無しさん@お腹いっぱい。
2009/02/06(金) 12:19:50護符とかの。
0081名無しさん@お腹いっぱい。
2009/02/06(金) 12:51:06なお、Script-Fuの名はカンフー(Kung-fu)からきている。
0082名無しさん@お腹いっぱい。
2009/02/06(金) 15:28:51偉丈夫、気丈夫、大丈夫
0083名無しさん@お腹いっぱい。
2009/02/06(金) 15:34:190084名無しさん@お腹いっぱい。
2009/02/06(金) 15:57:59起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、
0085名無しさん@お腹いっぱい。
2009/02/06(金) 16:11:31いつの人ですか?
ここ3年くらい使ったことないよ!
0086名無しさん@お腹いっぱい。
2009/02/06(金) 17:36:190087名無しさん@お腹いっぱい。
2009/02/06(金) 23:17:30これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?
0088名無しさん@お腹いっぱい。
2009/02/06(金) 23:30:300089名無しさん@お腹いっぱい。
2009/02/06(金) 23:45:25了解しました
[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63
ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?
0090名無しさん@お腹いっぱい。
2009/02/07(土) 00:16:57<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。
0091名無しさん@お腹いっぱい。
2009/02/07(土) 00:43:49曖昧さがあるので|記法に変った。
0092ミジンコ未満
2009/02/07(土) 01:17:25コマンドを実行する。なんてことをするにはどうすればいいですか
0093名無しさん@お腹いっぱい。
2009/02/07(土) 01:32:22http://www.linux.or.jp/JF/JFdocs/SCSI-2.4-HOWTO/sr.html
0094名無しさん@お腹いっぱい。
2009/02/07(土) 11:06:58head -c 1 /dev/cdrom > /dev/null 2>&1 && command
>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。
0095名無しさん@お腹いっぱい。
2009/02/08(日) 00:47:14暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか
0096名無しさん@お腹いっぱい。
2009/02/08(日) 00:49:330098名無しさん@お腹いっぱい。
2009/02/08(日) 02:15:27現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。
1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力
これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。
0099名無しさん@お腹いっぱい。
2009/02/08(日) 03:18:26ところどころ日本語も意味不明
更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい
0101名無しさん@お腹いっぱい。
2009/02/08(日) 07:23:22なぜ同期ツールを始めから使わないのか?
e.g. rsync等
■ このスレッドは過去ログ倉庫に格納されています