[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 22:57 / Filesize : 109 KB / Number-of Response : 480
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/

11 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:16:58 ]
solarisのdfとかduで、サイズをギガ表記にしたいんだけどスクリプトでちょちょいとできないですかね?

12 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:18:21 ]
solaris10以降は、-hオプションがついてる。

13 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 00:42:41 ]
-hがないんですよ
バージョンは失念しました

14 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 06:46:50 ]
SolarisのdfってBLOCKSIZEはみないのか?

15 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 08:37:13 ]
$(command) 1より `command` が推奨なのってなんで?

16 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 08:45:55 ]
SunOSとかNEWS-OSとかでも動くから

17 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 09:44:41 ]
1 が不要だから。

18 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 11:53:48 ]
コマンドをパイプで複数実行する際に最初のコマンドでエラーだったら
その後のパイプ以降は実行しないというのは可能ですか?

19 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 12:17:42 ]
パイプってのは、あるコマンドを実行してそれが終わったら出力を
次のコマンドに流して、という仕組みではない。
どうしてもそういうことがやりたければパイプを使わない。

commandA > tmpfile.$$ && commandB < tmpfile.$$

# unix ではなく dos のパイプはこういう仕組みだったりする。



20 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 23:27:43 ]
シェル用語では、コマンド1個だけでもパイプラインと言う。
パイプライン1(=command1)がエラーなら
パイプライン2(=command2)を実行しないのなら、
command1 && command2
でよい。
>>18 は command1 と command2 の標準入出力を、
pipe(2)でつなぐとは言っていないのだから。

21 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/21(水) 23:36:39 ]
こじつければ(形式的には)個々はパイプラインかもしれないが、
「パイプで複数実行」には到底ほど遠いだろう

22 名前:名無しさん@お腹いっぱい。 [2008/05/22(木) 21:37:11 ]
質問させてください。
a.txtファイルにbbbと言う文字があった場合、その文字を完全に削除するにはどうしたらいいでしょうか?

-----
aaa
bbb
ccc
-----

例えばa.txtの内容が上ようなとき、下のように置換したい。よろしくお願いします。

-----
aaa
ccc
-----

23 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 21:46:57 ]
grep -v bbb a.txt>b.txt

24 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:03:03 ]
>>23
すみません。それをa.txtに保存したいです。

25 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:13:05 ]
(rm a.txt; grep -v bbb > a.txt) < a.txt


26 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:42:55 ]
$ sed -e '/bbb/d' -i '' a.txt

27 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/22(木) 22:43:28 ]
>>25
すみません。iノード番号を変えずに保存したいです。

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使ってみれば






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<109KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef