1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42: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。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その14 pc12.2ch.net/test/read.cgi/unix/1233179688/
262 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/21(金) 10:10:39 ] そもそも human readableな ls の output を filtering するというのが bad design なんんだよな。 次期 ls には是非、 --format='%f %s' 的な optionを appendしていただくことを wishする。
263 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/21(金) 10:14:50 ] stat(1)あたりをposixに入れる方が早くないか?
264 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/21(金) 12:51:07 ] >>262 英語使って、かっこつけているつもり?
265 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/21(金) 16:40:18 ] ルー語はカッコよかったんか
266 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/22(土) 11:36:50 ] csh の存在価値はなんだろう。 bash でいいじゃん。
267 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/22(土) 12:07:49 ] それはこっちで ↓ C shell 撲滅委員会 pc12.2ch.net/test/read.cgi/unix/1094041299/
268 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/22(土) 18:50:28 ] bashが無駄に重くなっていってくれたおかげで tcshは無難に使えるログインシェルという位置を確保できたw そしていろいろと便利な設定をするためにcshスクリプトの書き方を知る必要がある。
269 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/22(土) 19:37:03 ] ksh93を使ってる俺は勝ち組
270 名前:名無しさん@お腹いっぱい。 [2009/08/25(火) 17:34:40 ] 質問です 1 12 123 1 2 23 のようなテキストを xx1xx12x123 xx1xxx2xx23 (x=空白) のように幅を揃えるにはどうすればいいですか?
271 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 17:44:42 ] awk '{printf("%3d%3d%4d\n",$1,$2,$3);}' < test.txt
272 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 17:50:50 ] >>271 勝手に桁数決め打ちしていいのか? 同じカラム上にある最大桁数をサーチした上で %*d (*は数字)に しなければならないという質問だと思うが。
273 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 17:57:58 ] それは質問者が言うべきこと。
274 名前:270 mailto:sage [2009/08/25(火) 18:09:22 ] すいません。実際の数字は一行に数千あって行も数千あります。 でも一つの区切りの中の数字は三桁までです。
275 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 18:15:40 ] 絵に描いたような後出しw
276 名前:ruby,perl等のほうが早いかも mailto:sage [2009/08/25(火) 19:34:46 ] >>274 一行にある数字の数は固定している?それとも変動もある?
277 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 21:29:45 ] >>270 >>274 #!/bin/sh while read line do set $line while [ $# -ge 1 ] do printf '%3d ' $1 shift done echo done
278 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 21:30:54 ] >>276 固定してます。
279 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 21:36:54 ] >>277 だったら forの方がいい。 #!/bin/sh while read line do for n in $line do printf '%3d ' $n done echo done >>278 直前の回答読めよ。
280 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/25(火) 21:44:07 ] すいませんリロードしてませんでした。 上手く行きそうです。みなさんありがとうございました。
281 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/26(水) 00:47:55 ] >>279 | sed 's/ $//'したいな
282 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/26(水) 06:48:36 ] >>279 いや、行末のスペースを取ることを考えると、 >>277 の方式の方がいいんだよ。 #!/bin/sh while read line; do set -- $line while [ $# -ge 2 ]; do printf '%3d ' $1 shift done if [ $# -eq 1 ]; then printf '%3d' $1 fi echo done
283 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 11:50:33 ] execute.shellを実行し、psコマンドを実行すると以下のように表示されます。 PID TTY TIME CMD 13219 pts/1 00:00:00 bash 17938 pts/1 00:00:30 java 17222 pts/1 00:00:37 java 25353 pts/1 00:00:00 ps CMDのjavaがexecute.shellのプロセス名みたいなんですが、 これをexcecuteと表示させることは可能ですか?
284 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 12:28:06 ] >>283 コマンド自身がargv[0]を書き換えてるか、 またはexecute.shellは単なる起動スクリプトで、実際にjavaがexecされてるから、 元のコマンドのexcecuteを表示させることは無理。
285 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 12:39:26 ] コマンドライン引数にかけらが有るかもしれない。 ps -a
286 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 13:59:26 ] >>284 了解です。レスありがとうございます。 >>285 ありがとうございます。 ps -aしてみましたが表示は変わらなかったです。 2重起動を防止するため、プロセス名を取得しようとしていたのですが無理のようなのであきらめました。 PID番号付きのファイルを作成することにしました。ファイルはなるべく作りたくなかったのですが。
287 名前:名無しさん@お腹いっぱい。 [2009/08/27(木) 17:29:53 ] sedコマンドをつかって aaa|abc|bef|efg||||aa の文字列(|は区切り文字)の一番最後のフィールドのaaの部分をbcdに変えて aaa|abc|bef|efg||||bcd と出力させるにはどのようにすればよいのでしょうか?
288 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 17:48:38 ] 最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか
289 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 17:54:37 ] >>287 sed指定の質問ならsedスレへ ↓ sed pc12.2ch.net/test/read.cgi/unix/1085730992/
290 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 17:57:51 ] >>287 sed 's/|[^|]*$/bcd/'
291 名前:名無しさん@お腹いっぱい。 [2009/08/27(木) 17:58:17 ] sygwinでのbashなんですが declare -a userhome userhome=($(cut -d":" -f6 /etc/passwd)) とすると、/etc/passwdの6番目の要素がnullの場合 配列に何も代入されません。 何か文字を代入したい場合はどうすればいいんでしょうか?
292 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 18:04:24 ] >>291 userhome=($(cut -d":" -f6 /etc/passwd | sed 's/^$/none/'))
293 名前:名無しさん@お腹いっぱい。 [2009/08/27(木) 18:10:41 ] >>290 ありがとうございます
294 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 18:15:40 ] #!/bin/sh s="~/work/" ls $s としても、 No such file or directoryと言われます。 たぶん~が展開されていないと思うのですが、 どうすれば展開できますか?
295 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 18:26:29 ] >>294 eval ls $s または、最初から s=?/work/ で代入。(ダブルクォートなし)
296 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 18:37:12 ] >>288 > 最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか ↑ そんなの質問の意図を読めばわかる。 >>290 みたいに回答した方が早い。
297 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 18:48:08 ] >>290 sed 's/|[^|]*$/|bcd/' だろw >>293 ありがたいか?w
298 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 19:10:28 ] >>294 由緒正しきshは~は使えない。$HOME使え。
299 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 19:28:05 ] トホホの自民 生き残れるのはひと握り 大マスコミの選挙予測によると、自民党は壊滅状態で、当確を数えたほうが早いほど。 小選挙区で確実に生き残れるのは元・現閣僚が7人ほど、石原伸晃など地盤が強固な世襲議員が6人ほど、重鎮が3人。 ほかに5人程度のひと握り。自民党が少数政党に転落し、永田町の勢力図が一変する可能性だってある。 gendai.net/?m=view&c=010&no=22639
300 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:04:45 ] 便乗質問だけど、 >>298 チルダ展開は bash だけなの? sh は展開してくれない?
301 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:09:45 ] sh の種類による。
302 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:10:04 ] >>300 bashだけではない。 Solarisなどの純正sh以外、 ash ksh zsh dash 等、みんなチルダ展開には対応してる。 でも $HOMEを使う方がお勧め。
303 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:10:36 ] posix sh ならやってくれるはず ~ だけなら $HOME で間に合うが、~user はどうしようもないし
304 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:21:53 ] posix(笑)
305 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/27(木) 21:24:00 ] >>303 IFS=: set `getent passwd user` echo $6
306 名前:300 mailto:sage [2009/08/27(木) 21:42:19 ] サンクス。 アムロ「マ ~ さーん!」 ……すまん。
307 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 11:20:37 ] >>305 getent が使える環境で ~user の展開をしてくれないシェルって何があるの?
308 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 11:45:53 ] >>307 Solaris
309 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 12:28:29 ] 可搬性を求めると csh -fc 'echo ~user' になるかな?
310 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 12:41:08 ] $ csh -fc 'echo ~user' csh: not found
311 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 13:09:31 ] 最近のLinuxの鳥はデフォではcsh入ってないからな
312 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 13:16:18 ] 可搬性を求めてるから getentだろ。
313 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 13:44:58 ] 可搬性なんて幻想
314 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/28(金) 21:12:21 ] image.blog.livedoor.jp/insidears/imgs/6/c/6c39db7d.jpg
315 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/30(日) 00:11:54 ] シェルスクリプトは奥が深すぎて、きりがない。 どこらへんまで身に付いたら、「シェルスクリプトは理解した」と納得していいのかな?
316 名前:名無しさん@そうだ選挙に行こう [2009/08/30(日) 19:19:46 ] 実行できたら出いいよ
317 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/30(日) 21:21:06 ] すみませんが詳しい方のみ回答をお願いします
318 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/30(日) 22:00:26 ] >>315 それが、公での質問の仕方として相応しい、と自分で納得し、的確な回答を期待できる質問文だ、と納得して書き込んだキミ。 >>316 はキミの「納得していい」レベルに的確にあわせてくれたんだろwwww 結論、キミ次第。 別の回答がほしければ、他人の立場で>>315 を読み直すことから始めよう。
319 名前:315 mailto:sage [2009/08/31(月) 21:53:35 ] なんだ? 俺の知らんうちに。 >>317 は誰だよ?w >>318 自分次第、そうだねぇ。 いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、 具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。 とりあえず、元々 bash にある、起動まわりのスクリプトを読み解くことにするよ。
320 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/31(月) 22:11:18 ] >>319 > なんだ? 俺の知らんうちに。 1ヶ月ROMってろ
321 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 02:26:03 ] 「元々 bash にある、起動まわりのスクリプト」って何だ?
322 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 03:47:22 ] >>321 rcスクリプトのこととエスパー。
323 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 10:35:12 ] >>319 > いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、 > 具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。 そういった「目的」を明示しなかったのが問題だったのだよ。 きっと皆の脳裏には、破滅に向かうプロジェクトの上流工程が彷彿したお。
324 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 11:24:46 ] ・パラメータ展開の修飾子を使いこなす ・リダイレクトを使いこなす 他には?
325 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 12:30:22 ] ・evalを使いこなす
326 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 12:39:21 ] × evalを使いこなす ○ evalを使いこなしていばる
327 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 13:57:58 ] ◎ evalは俺の嫁。
328 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 14:02:02 ] >>327 evil の間違いでしょ?
329 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 14:08:10 ] >>324 リダイレクトというより、ファイルディスクリプタを使いこなせるようになりたい。
330 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 14:24:51 ] 初 evalる事覚える 中 evalらない事を覚える 上 たまにevalる事を覚える
331 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/01(火) 16:28:10 ] あんまりおもしろくないからその辺で。
332 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 10:15:12 ] ls $dirの結果を変数sに格納するにはどうすればいいですか?
333 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 10:43:40 ] >>332 s=`ls $dir` ってこと? なんか罠がありそうな質問だ。
334 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 11:19:57 ] それを1個ずつとりだしたいとか、スペース・タブが入ってるとか…
335 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 13:49:18 ] 後のこと考えるなら、-1オプション付けといたほうが無難かもね。
336 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 14:17:12 ] >>335 つ、釣りだよな?
337 名前:名無しさん@お腹いっぱい。 [2009/09/02(水) 14:19:12 ] 俺も初心者なんだけど、 ls -1 . | while read s do done てことでしょ?何で釣り?
338 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 14:21:08 ] >>337 ls -1 ls | cat s=`ls` echo "$s" 違いを述べよ。 よって、釣りじゃなければ「無知」。
339 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 14:24:32 ] >>337 ls | while ... みたいに、lsの出力がパイプとかリダイレクト(端末以外)の場合は、 -1 オプションを付けなくてもデフォルトで勝手に -1が付くんだよ。 s=`ls $dir` の場合でも同じ。 「-1付けろ」なんて言ってる >>335 はアフォ。
340 名前:337 mailto:sage [2009/09/02(水) 14:53:59 ] なるほど・・・勉強になった!
341 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 16:44:41 ] 「付く」わけではない。
342 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 16:45:59 ] けっきょく>>332 は納得したの?
343 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 16:51:58 ] >>341 「勝手に -1の効果が付く」と言って欲しいのかよww
344 名前:332 mailto:sage [2009/09/02(水) 16:52:09 ] 返事が遅くなって申し訳ありません。 >>333 さんのレスが欲しかった答えでした。
345 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/02(水) 16:55:27 ] >>343 うん。
346 名前:名無しさん@お腹いっぱい。 [2009/09/03(木) 17:03:44 ] 質問させて下さい。 #!/bin/bash echo $"文字列$hensu" のような記述がありました。 $"〜"という表現を初めて見たのですが、 クォートの左の$は何の役割ですか?
347 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/03(木) 17:15:00 ] bash依存だから、覚えない方がよろしい
348 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/03(木) 17:51:38 ] >>346 bash$ echo $"FAILED" FAILED bash$ TEXTDOMAIN=initscripts bash$ echo $"FAILED" 失敗
349 名前:346 mailto:sage [2009/09/03(木) 20:06:49 ] >>348 ああ、*.poだか*.moだかですか。 ありがとうございます。
350 名前:335 mailto:sage [2009/09/04(金) 09:29:19 ] >>338 >>339 やっべオレ超アフォ!! 感動した!!!!! ヒャッハ!!!ヽ(゚∀゚)ノ
351 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:01:39 ] シェルスクリプト初心者です。 全てのファイル名の最後の余計な部分を一括して取り除くにはどうしたらいいんでしょうか? $ ls hoge.hog;piyo fuga.fug;piyo foo.fo;piyo bar.ba;piyo この ;piyo を取り除きたいんです。 とっさに for hoge in *\;piyo; do mv $hoge まで打ち込みましたが、これ以上解りません… どなたか教えていただけないでしょうか
352 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:09:31 ] >>351 for hoge in *';piyo'; do mv "$hoge" `basename "$hoge" ';piyo'`; done
353 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:21:55 ] できました ありがとうございます。 文字列の操作 少し勉強します…
354 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:31:32 ] どうせbashだろうから、 ↓の方が簡単だろうけどな。 for hoge in *';piyo'; do mv "$hoge" "${hoge%;piyo}"; done
355 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:49:34 ] posixをbashと言っちゃう恥知らず。
356 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/06(日) 21:57:33 ] posix(笑)
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/07(月) 14:34:09 ] なんでposixをbashと言ってると思ったんだろう。
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/09(水) 12:51:42 ] Joshua Price氏がMake Tech Easierにおいて8 Useful and Interesting Bash Promptsのタイトルのもと、 bashシェルにおけるさまざまなコマンドプロンプトの設定例を紹介している。使いやすいコマンドプロンプトは コマンドラインの使い方を変えると説明があり、同氏が調査した中でも、特によく使われていたり、 おもしろいプロンプトとその設定例が紹介されている。紹介されているプロンプトは次のとおり。 1.間違ったコマンドを入力すると顔が変わるプロンプト journal.mycom.co.jp/articles/2009/09/09/bash/images/002.jpg 2.間違ったコマンドを入力すると色が変わるプロンプト journal.mycom.co.jp/articles/2009/09/09/bash/images/003.jpg 3.複数行プロンプト journal.mycom.co.jp/articles/2009/09/09/bash/images/004.jpg 4.データごとに色を変えて見やすくしたプロンプト journal.mycom.co.jp/articles/2009/09/09/bash/images/005.jpg 5.フルパスを表示する複数行プロンプト journal.mycom.co.jp/articles/2009/09/09/bash/images/006.jpg 設定方法はソース先で journal.mycom.co.jp/articles/2009/09/09/bash/index.html
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/09(水) 12:55:34 ] >>358 >>5 このスレはシェルスクリプトについてのスレです。 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの 使い方の質問などはスレ違いなので無用に願います。
360 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/09(水) 13:01:46 ] 1レスくらいどうってことないだろ。 器量が狭いな
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/09(水) 13:07:57 ] つまんねー記事貼りつけるな。しかもbash専用。
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/09(水) 13:13:32 ] 俺はbashですが何か?