- 1 名前:名無しさん@お腹いっぱい。 [2008/05/20(火) 20:58:04 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 シェルスクリプト総合 その10 pc11.2ch.net/test/read.cgi/unix/1202725267/
- 28 名前:22本人です ◆wSaCDPDEl2 mailto:sage [2008/05/22(木) 22:50:27 ]
- >>26
ありがとう!sedでやりたかったです。 でもsedは使えるはずなのにエラーが出てしまいました。 エラー「sed: を読み込めません: そのようなファイルやディレクトリはありません」 バージョンが違うのでしょうか?ちなみにLINUXでやってます。
- 29 名前:22本人です ◆wSaCDPDEl2 mailto:sage [2008/05/22(木) 22:53:42 ]
- あ、できました。
sed -i '/bbb/d' a.txt みなさん初心者にも親切に教えてくれてやさしいですね。 ありがとうございました。
- 30 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:24:52 ]
- >>29
おいおい、 sed -i '/bbb/d' a.txt だと i-node番号変わるぞ。i-node番号変えちゃ駄目(>>27) じゃないのか?
- 31 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:30:06 ]
- それは俺の創作だ。正直すまんかった。
- 32 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 23:34:24 ]
- >>22 >>27
iノード番号を変えずに a.txtを修正する方法の正解の md5を貼っておくぞ。 25fe9a9dfa4248593f6aa361db01a222 さあ、オマエラ考えてみろ。
- 33 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 00:30:59 ]
- cat a.txt > tmp; sed '/bbb/d' tmp > a.txt; rm tmp
- 34 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 00:39:56 ]
- なんでiノード番号変わっちゃだめなの?
- 35 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 06:44:52 ]
- >>33
一時ファイル作っちゃ駄目
- 36 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 06:49:17 ]
- >>34
a.txtが他のファイルとハードリンクしていた場合、 sed -i とかだとハードリンクが切れてしまう。
- 37 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 09:35:47 ]
- printf "g/bbb/d\nwq\n" | ed a.txt
- 38 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 11:25:56 ]
- >>36
sed -iって、viなんかで編集するのとは違う理屈で動いているってことかな?
- 39 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/23(金) 23:19:47 ]
- GNU sedのソースを見てみたが、inplace編集では、テンポラリファイルを
開いて書き込んだのちリネームしているね。 sed-4.1.5/sed/execute.c:658 (開く方) sed-4.1.5/sed/execute.c:712 (閉じる方)
- 40 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/24(土) 16:21:15 ]
- オーナーを保存できないじゃないか
- 41 名前:名無しさん@お腹いっぱい。 [2008/05/25(日) 08:58:02 ]
- カレントディレクトリに、
hoge-1.22.3.tar.gz hoge-1.23.tar.gz hoge-1.24.1.tar.gz fuga-3.31.1.tar.gz fuga-3.5.4.tar.gz : みたいなソースのtarボールがたくさんあります。 これらのファイルのファイル名を見て、 最新バージョンだけ残して、最新以外のファイルを削除するシェルは どうやったら発行できますか? なお、タイムスタンプは当てにならないので、 あくまでファイル名だけで判断してください。
- 42 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:09:54 ]
- シェルってゆうな。クズ。
発行ってゆうな。クズ。
- 43 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:23:44 ]
- 定番の突っ込み乙。で回答は?
- 44 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 09:35:44 ]
- >>42
ウチの会社でシェって呼ぶ人もいるよ
- 45 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 10:19:39 ]
- >>43
そもそも最新バージョンとそれ以外を同じところに溜めたのが間違い。
- 46 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 12:39:54 ]
- パッケージ名の定義、バージョンの新旧の定義をしろ。
- 47 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 13:18:17 ]
- >>46
お前自身の定義でいいから答えてみろよw
- 48 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 14:06:29 ]
- 断る。
- 49 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:06:27 ]
- ×断る。
○能力不足のためできない。
- 50 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:38:11 ]
- 「答えられないなら黙ってろ」というポリシーは変えたのか? www
- 51 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 15:54:09 ]
- >>45-46 >>48
答えられないなら黙ってろ
- 52 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 17:39:31 ]
- ぽまいら へるぷ!
hoge0501-0000.wav hoge0501-0100.wav hoge0501-0900.wav の複数ファイルをmp3で小さくしたいのですよ hoge0501-0000.wav → hoge0501-0000.mp3 ってか0000の部分を0000のままにしたいのですが… なんかいい知恵を!!! おながいします lameとかgogoの使い方は大丈夫ですw
- 53 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 17:51:01 ]
- >>52
infile=hoge0501-0000.wav outfile=`basename $infile .wav`.mp3 あとは lameとかで $infile と $outfile を参照。
- 54 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 18:04:34 ]
- >>52 おお、ファイル名そのものを変数としるのね
dクス! さっそくやってみます!!
- 55 名前:便乗炭/びんじょうたん mailto:sage [2008/05/25(日) 22:20:47 ]
- あのぉ〜。。。。。
>>53 を連続で処理するには?
- 56 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/25(日) 22:32:03 ]
- for infile in "$@";do outfile=`basename $infile .wav`.mp3; 変換する ;done
- 57 名前:便乗炭! mailto:sage [2008/05/26(月) 00:17:11 ]
- >>56 ご丁寧にありがとうございます orz szo ヘコヘコ
- 58 名前:名無しさん@お腹いっぱい。 [2008/05/27(火) 18:01:23 ]
- 質問です。
if文で現在起動中のデーモンを確認するにはどうしたらいいでしょうか?
- 59 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:14:00 ]
- >>58
pc11.2ch.net/test/read.cgi/linux/1211384088/211 の人?
- 60 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:14:58 ]
- そんな事どうだっていいだろうがカス
- 61 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:18:01 ]
- 図星かw
- 62 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 18:51:36 ]
- >>59 >>61
わからないなら黙ってろ
- 63 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 19:07:31 ]
- >>60>>62
君も黙ってなよw 言ってることは同意だけど。
- 64 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 19:09:55 ]
- pgrepは戻り値返すよ。
if pgrep hoge; then 何か fi で桶。
- 65 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 20:15:40 ]
- >>64
ありがとうございました
- 66 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 21:20:30 ]
- >>64
pgrep で確認してるのであって、if で確認してるわけじゃないと思うが。
- 67 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/27(火) 21:34:58 ]
- >>66
本人がいいって言ってるんだから、それがすべて
- 68 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 01:35:31 ]
- >>66
Cでも何でも条件で確認して、ifはその結果で分岐するだけだと思うが。
- 69 名前:名無しさん@お腹いっぱい。 [2008/05/28(水) 21:18:30 ]
- 1から100までの乱数を得るとかってでないですかね
- 70 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 21:22:39 ]
- >>69
echo $((RANDOM*100/32768+1))
- 71 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:07:29 ]
- ありがとうございます
変数であるんですね ちなみに32768というのは?
- 72 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:09:29 ]
- 2の15乗。15bit乱数だから。
- 73 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:10:32 ]
- bash依存乙w
- 74 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:28:12 ]
- だからksh由来だと何度(ry
- 75 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:29:03 ]
- >>73-74
わからないなら黙ってろ
- 76 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 22:45:00 ]
- 純正シェルだとどうやるの?
- 77 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 23:09:49 ]
- 純正ってナニ?
- 78 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/28(水) 23:16:10 ]
- bshじゃないか?
bashじゃ無いオリジナルの
- 79 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 01:10:09 ]
- むかし、Bee Shell(ミツバチシェル)ってのを使ったことがあるせいか、
Bourne Shellのことはshか/bin/shと書いた方がいいような気がする。
- 80 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 02:18:20 ]
- sh が bashのリンクになってるのって最近のlinuxだけ?
- 81 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 03:11:30 ]
- >>79
HP-UXやAIXはksh改変版が使われている。 なんで、kshで拡張された便利機能もほとんど使えるようになっている。
- 82 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 05:28:36 ]
- >>80
UbuntuやDebianの/bin/shはdash
- 83 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 06:45:40 ]
- 能書きはいいから、純正シェルでのやりかた答えろ
- 84 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:08:01 ]
- >>66>>83
なんなの、この屑は
- 85 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:24:03 ]
- 純正シェルなんて言葉どこで覚えてきたんだ?
- 86 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:27:42 ]
- >>85
わからないなら黙ってろ
- 87 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:28:49 ]
- はーーーーーーい
- 88 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 07:34:09 ]
- >>83
echo $$
- 89 名前:69 mailto:sage [2008/05/29(木) 10:47:07 ]
- すいません
>>79をループして繰り返すと 3 20 43 70 81 10 15 49 60 87 みたいに1から100の間で増えて戻って増えてを繰り返します この規則性をなくせないですか?
- 90 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 11:10:35 ]
- >>89
echo $(($(head -c 2 /dev/urandom | od -An -d)*100/65536+1))
- 91 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 12:59:00 ]
- おお
意味はまったく理解不能ですがこれでいけそうです ありがとうございます
- 92 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:20:20 ]
- >>90
OS依存、GNU依存、bash依存乙。
- 93 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:24:26 ]
- >>92
わからないなら黙ってろ
- 94 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 13:34:33 ]
- 純正シェルではどうやるの?
- 95 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 16:32:15 ]
- 純正シェルでは
rm /bin
- 96 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 17:05:04 ]
- >>95
わからないなら黙ってろ
- 97 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 17:14:20 ]
- >>96
わからないなら黙ってろ
- 98 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 18:14:00 ]
- わからないならオナってろ
- 99 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 22:09:56 ]
- >>92
いちいち五月蝿いよ。 よりポータブルに直したい奴は、直して自分で書けばいいよ。
- 100 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:02:12 ]
- >>99
>1 > bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 って事なんじゃね。 つまり嫌味を言いながら実はこの決まりを代行してるツンデレ。 あと>92-94は>73-76の74が足りないな。おしい。
- 101 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:12:48 ]
- >>100
わからないなら黙ってろ
- 102 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/29(木) 23:14:45 ]
- うるさいのが一人いるなッ
- 103 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 00:38:12 ]
- ッ
- 104 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 00:42:35 ]
- でも、言ってることは正しいな
書くべきだよねえ
- 105 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 06:43:58 ]
- >>101
わかっているから黙ってない
- 106 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 07:57:37 ]
- >>100
明記できる奴は明記すればいい。 ポータブルに直せる奴は直せばいい。 >>92みたいな屑が一番邪魔。
- 107 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 08:45:48 ]
- 質問者が環境をちゃんと書けばいいんだよ。
- 108 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 08:50:20 ]
- 質問者の環境にかかわらず、純正シェルで動くことが条件。
- 109 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 09:59:15 ]
- 質問テンプレ
使っているOS名・バージョン: (※LinuxユーザはLinux板へ) 使っているシェルの名前・バージョン: 使っているシェルのフルパス: 移植性: 上記環境で動けば十分 / 多くの環境で動かす必要がある
- 110 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:12:44 ]
- GNU/Linux, *BSD使い始めたころから補完ができるってだけの理由で特に理由もなくBash使ってるけど
他に何か良いShellないかな。 Bashに特に不満はないけど。
- 111 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:28:30 ]
- zsh使ってみれば
- 112 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 10:28:37 ]
- >>109 氏からの回答が欲しい場合は >>109 に従ってね。
でも俺はエスパーだから、OSとかバージョンとか書かなくても回答できちゃうよ。 気軽に質問してね。もち、Linuxユーザーの質問もOK。
- 113 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 11:14:08 ]
- エスパー>>112からの回答が欲しい場合はエスパースレへ。
pc11.2ch.net/test/read.cgi/unix/1207042632/ 前任のエスパーは質問者の環境壊して再インストールさせる低レベルだったけど、 >>112はそんなアホじゃないだろうと期待。
- 114 名前:名無しさん@お腹いっぱい。 [2008/05/30(金) 11:41:59 ]
- カレントに移動しないと起動できないソフトがあります。
これを、カレントを移動しなくて済むようにするシェルはできませんか? >>109 さん以外の方、回答をよろしくお願いします。
- 115 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:39:40 ]
- CentOS bin/bashの条件式での質問です。
前提としまして、file1、file2、file3、file4という似たファイル名が 複数あるとします。 そこで条件式内で、[ -e file* ] というようなfileから始まるファイルに一致させたいのですが どのように記述したら宜しいのでしょうか?
- 116 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:40:52 ]
- >>115
シェルスクリプト総合@LINUX Part4 pc11.2ch.net/test/read.cgi/linux/1210999497/
- 117 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:44:34 ]
- >>115
そういう場合はlsの戻り値を使う。 if ls file* > /dev/null 2>&1 ; then hoge fi
- 118 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:45:16 ]
- >>116
わからないなら黙ってろ
- 119 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 13:48:09 ]
- >>116
スレ間違えてしまいすいません、誘導ありがとうございます。 >>117 lsの戻り値を条件式で使えたとは盲点でした。多少分からない 箇所がありますので調べつつ挑戦します。ありがとうございました
- 120 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 14:10:40 ]
- >>118
わかっちゃいるけどやめられない
- 121 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/30(金) 20:38:57 ]
- >>114
普通に、 #!/bin/sh cd /path/to/hoge exec ./hogesoft "$@" で桶。cdしてしまうように見えるが、シェルスクリプト自体が別シェルなので カレントディレクトリは実行時のディレクトリから変わらない。
- 122 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 03:49:40 ]
- こんなスクリプトを書いてプロセス監視&常時起動させていますが、
数時間走らせると、★の行を食ったまま、停止してしまいます。 orz 原因&解決策か、もしくはタイムアウトを設定する方法を ご教示いただけませんでしょうか。。 #!/bin/sh while true do ★ret=`ps -ef | grep "collector.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge.php & fi sleep 1 done
- 123 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 06:14:58 ]
- pgrepないの?
- 124 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 07:19:56 ]
- >>122
まず、wc -lしたりretに代入したりしてるのが無駄。 grepは戻り値返すから、 if ps -ef | grep "collector.php" | grep -v grep > /dev/null; then で桶。
- 125 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 07:34:52 ]
- >>122
発想を転換しろ。 もし、php /hoge.phpを起動して、落ちたら再度起動、ってやりたいだけなら、 while : do php /hoge.php done だけでOK。&は付けない。sleepもpsも必要なし。
- 126 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 17:03:52 ]
- >>123,124
ありがとう、おっしゃる通り。 試してみます。 >>125 惜しい。 実はhoge.phpは1種類ではなく、3種類存在します。 実際はret〜fi間が、3個あり、hoge1.php〜hoge3.phpを対象にチェックしています。 #>>122のコードで、collector.phpとhoge.phpは同一です。コピペミススマソ。 #!/bin/sh while true do ★ret=`ps -ef | grep "hoge1.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge1.php & fi ★ret=`ps -ef | grep "hoge2.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge2.php & fi ★ret=`ps -ef | grep "hoge3.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge3.php & fi sleep 1 done hoge1.php の終了を待たずに hoge2.php や hoge3.php の プロセスチェック&起動を行いたいため、末尾に&を付けている次第です。 hoge1.php〜hoge3.php毎にシェルスクリプトを3個作成すれば >>125の通りで期待が叶いますが、それはそれで無駄な感じがしまして。
- 127 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 17:23:55 ]
- >>126
シェルスクリプトひとつでできる。 while文の最後のdoneに &を付けるのがポイント。 while : do php /hoge1.php done & while : do php /hoge2.php done & while : do php /hoge3.php done &
- 128 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/31(土) 18:12:48 ]
- >>127
げ、すげぇ。できました。。プロセスが3つ立ち上がるのですね。 ありがとうございます!! シェルスクリプトすごいっすねぇ。。。感動。
|

|