1 名前:名無しさん@お腹いっぱい。 [2007/02/15(木) 14:28:44 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その7 pc10.2ch.net/test/read.cgi/unix/1157601611/
460 名前:459 mailto:sage [2007/05/20(日) 04:42:15 ] 459は取り消し! 11.22.33を a[0]=11 a[1]=22 a[2]=33 のように配列に代入したい。 よろしくお願いします。
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 05:39:47 ] 宿題でつか
462 名前:459 mailto:sage [2007/05/20(日) 06:19:25 ] 宿題でつ
463 名前:459 mailto:sage [2007/05/20(日) 07:14:05 ] スレ汚してごめんなさいできまつた
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 21:56:12 ] テキストファイルに、ファイルの場所がずらずら書かれていて ----- /usr/local/etc/pussy001.jpg /usr/local/etc/pussy002.jpg /usr/local/etc/pussy003.jpg : ----- そこに書かれているファイルを指定した場所に移動させたいんです。 で、こんな感じで動くスクリプトを書きたいなぁと考えているんですが cat list.txt | grep jpg | mv.sh /work/pussy この mv.sh の書き方が分かりません。
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 22:02:27 ] >>464 mv `grep jpg list.txt` /work/pussy で、一発。・・・で、pussyってww
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 22:47:23 ] >465 残念ながら、ファイル名にスペースがあるとだめでした。 sh, tcsh, bashで試してみましたが、どれも同じです。
467 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 23:18:02 ] >>464 の例では、ファイル名にスペースが入ってないじゃないか。 そういう条件は先に例に含めて書くこと。 ファイル名にスペースがある場合のやり方ももちろん知ってるが、 わざわざ教える気にならないので俺はパス。
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 23:25:45 ] >>466 IFS=' ' mv `grep jpg list.txt` /work/pussy
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 00:42:01 ] (while read f; do mv "$f" dest/ ; done) < file >>467 ファイルの長さを考慮しないgrep戦法しか提示しなかった奴が そんな理屈をこねても見苦しいだけ。
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 06:22:05 ] >>469 残念ながら、ファイル名に \ があるとだめでした。
471 名前:名無しさん@お腹いっぱい。 mailto:sage read -r [2007/05/21(月) 10:38:53 ] じゃあ諦めな。
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 11:09:30 ] >>471 ファイル名の \ を考慮しないを考慮しないwhile read戦法しか提示しなかった奴が そんな理屈をこねても見苦しいだけ。
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 11:17:06 ] というか、>>469 って、元の質問の jpg で grepするの忘れてるじゃん。 テストだったら0点。
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 11:25:38 ] でもテストじゃないよ。
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 11:33:37 ] そういう香具師が、「それはケアレスミス。答えはわかってた」とか後で言うんだよな。
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 11:37:45 ] なんでそんな完璧にこだわるんだろ。 質問者のヒントになればいいじゃん。
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 16:16:07 ] 低能同士、仲良く!
478 名前:464 mailto:sage [2007/05/22(火) 00:44:46 ] すみません、御礼が遅れました。 という訳で >465 >468 >469 全て参考になりました。特にIFS=〜は初めて 知ったので成程と関心しました。 この場をお借りして厚く御礼申し上げます。
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 00:59:36 ] xargsは? grep jpg list.txt | xargs -i mv {} /work/pussy
480 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 12:09:35 ] >>479 空白が含まれているとダメだろ。
481 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 14:28:33 ] grep jpg list.txt | tr '\n' '\0' | xargs -0 -i mv {} /work/pussy
482 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 14:39:38 ] >>481 ファイル名に改行が含まれてるとだめだろw
483 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 19:06:13 ] sudo find / -name '*pussy*' -exec rm -rf \{\} \;
484 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 19:18:18 ] デリミタが改行なリストなんだから要素に改行は含められないんじゃ? 改行入りファイル名を考慮するならリストは改行文字以外で区切るべき だと思う.
485 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 19:20:20 ] ファイル名に改行を入れるアホなんてほっとけ(w
486 名前:ウサチャソ mailto:sage [2007/05/22(火) 21:00:22 ] 試しに作ってみた。 % touch aaaa^Maaaa % ls -lF aaaa*--r-- 1 ウサチャソ users 0 5月 22 20:58 aaaa 表示バグってるよ…
487 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 21:19:38 ] 改行と復改の区別ができないお子様は犬... 以下略
488 名前:ウサチャソ mailto:sage [2007/05/22(火) 21:37:01 ] >>487 改行のみ入れるのは面倒臭かったんだスマソ
489 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/22(火) 21:57:27 ] >>488 $ touch 'aaaa aaaa' だろ。 $ > 'aaaa aaaa' でも可。
490 名前:ウサチャソ mailto:sage [2007/05/22(火) 22:14:31 ] CTRL+Vが楽だったんで、つい… ちなみに、>>489 でも >>486 でもCygwinだと同じ表示。 -rw-r--r-- 1 ウサチャソ なし 0 May 22 22:10 aaaa?aaaa 今日始めて知った。
491 名前:ウサチャソ mailto:sage [2007/05/22(火) 22:15:58 ] あ゛っごめん、Cygwinは「--show-control-chars」が必要だった…。 スレ違いなんでもう消えます、スマソ
492 名前:名無しさん@お腹いっぱい。 [2007/05/24(木) 20:33:53 ] 質問します。 lsnrctl >>_EOF_ set log_file listener.tmp RET=$? if [ $RET -ne 0 ];then logger -t loglog -p local1.notice "切り替えに失敗しました" exit 1 fi exit _EOF_ という事をしたいのですがどうしてもsetコマンド以降エラーに なってしまいます。 対処法を教えていただけないでしょうか?
493 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/24(木) 20:51:21 ] 逆だ。 lsnrctl <<_EOF_
494 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/24(木) 20:55:16 ] あと、ヒアドキュメントの部分は、LSNRCTLのコマンドしか受け付けないぞ。
495 名前:名無しさん@お腹いっぱい。 [2007/05/24(木) 21:23:10 ] すいません逆に書いてました。 やはりLSNRCTLコマンドしか受け付けないですか・・・ う〜ん、どうしてもLSNCTLの中でシェルスクリプトの処理の記述を したかったのですが無理そうですね。 ありがとうございました。
496 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 07:13:03 ] 質問。 ファイルの最終から20行を削除したい。 どうしたらいいでしょうか?
497 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 07:46:41 ] >>496 wc で数えて、head で切り出すぐらいしか考え付かない
498 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 08:09:27 ] awk
499 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 08:33:29 ] tac なんてLinuxでもないかぎり標準装備じゃない罠 cat file | tac | sed '1,20d' | tac
500 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 12:43:49 ] 無意味なcat出た
501 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 14:05:40 ] tacが使えなければ sed '1!G;h;$!d' すればいいじゃない。
502 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 15:55:05 ] cat!出た!cat出た!得意技!cat出た!cat!これ!cat出たよ〜〜!
503 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 16:13:35 ] >>502 楽しそうだな
504 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 18:27:43 ] 俺は限界だと思った
505 名前:名無しさん@お腹いっぱい。 [2007/05/29(火) 00:14:45 ] tail つかって最後から20行みれ で、>>499 しる
506 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:58:13 ] 基本的にサブシェルはshを新たに起動するよりは動作が軽いですよね?
507 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 01:26:05 ] >>498 awkには入力ファイルの行数を保持する組み込み変数はないんじゃね? だから、結局wcでカウントしないとダメだったり。
508 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 01:47:08 ] は? awk '{a[NR]=$0}NR>20{print a[NR-20]}'
509 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:37:14 ] >>508 短くていいが、でかいファイル通すとメモリが…
510 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:54:34 ] 無理して一行でやるより、行舐めの回数が少ない方が好きだな。
511 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:57:15 ] >>510 ワンパスだし。消費メモリを考えればいいと思うが。
512 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 03:15:32 ] >>499 は論外。
513 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 09:33:18 ] awk '{if (FNR>20) print a[FNR%20]; a[FNR%20]=$0}'
514 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 10:12:43 ] 20行分だけバッファして遅延して出力させて ファイル末尾に到達したら終了させるとか。
515 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 19:07:30 ] >>514 書いてみよう
516 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 19:20:43 ] >>514 は >>513 がやろうとした事(間違ってるがw)
517 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 19:44:45 ] >>496 こういう場合、ed を non-interactive に使うのがいい。 最後20行ということは、$-19から $までだから、 echo '$-19,$d w outfile q' | ed infile ↑で桶。
518 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 21:46:07 ] sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'
519 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/30(水) 08:58:50 ] >>516 間違ってる?
520 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/30(水) 19:17:11 ] 質問なんですが・・ #!/bin/sh - tmpfile=/tmp/program.$$ cat "$1" | tr ' ' '\n' > tmpfile while read word do grep ${word} "$2" | いろいろと処理・・・ done < tmpfile てな感じのスクリプトなのですが、 第一引数のファイル中に、例えば -i と言うような語があると grep がオプションと解釈するのか何なのか、直後に while ループが 終了してしまいます。 '${'"$word"'}' だと grep には ${word} として渡されてしまいます。 何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか? (渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を 付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか 変数とか無しで行きたいものです)
521 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/30(水) 19:35:35 ] grep -e grep -
522 名前:520 mailto:sage [2007/05/30(水) 19:53:07 ] >>521 ありがとう。 シェルを騙さなくても grep の方で用意されていましたか、 良く考えりゃ当然ですね。
523 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/30(水) 21:22:55 ] オプション -- で、それ以降はオプションとは解釈しないってのは 結構な数のコマンドで使える。
524 名前:520 mailto:sage [2007/05/30(水) 23:07:09 ] >>523 ですね。 これまで -- なんて、はぁ?って感じでしたけど、 実に有用性が高いですね。 勉強になります。
525 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 11:43:37 ] 質問 インターネットに接続できるか試すコマンドってありますか? やりたいこと インターネットに接続できたら echo "できます" インターネットに接続できなかったら echo "できません" としたいです。
526 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 11:59:13 ] インターネットとLANの区別をしなくていいのかな?
527 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 12:05:24 ] 多分、この程度の精度でOKなんだろ。 if ping -c 1 www.yahoo.com >/dev/null 2>&1; then echo "出来ます" else echo "出来ません" fi
528 名前:525 mailto:sage [2007/06/03(日) 03:05:39 ] >>562 >>527 ありがとうございます できればヤフーなどの特定のサイトに依存せず 確実にインターネットに繋がるかどうか判断したいです。 もし無理なら特定のサイトでも構いませんが こういう場合通例としてyahoo.comを使うのが適切でしょうか?
529 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 07:09:14 ] 接続できていると分かったら、どこかと通信するんでしょ? その通信相手にすればいいよ。
530 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 07:21:06 ] >>528 何が目的なん?
531 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 08:59:25 ] その通信相手がICMPブロックしてるかも知れないから、ブロックしてない www.yahoo.comとかwww.google.comとか使えばいい。
532 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 11:01:00 ] >>528 君のほうから、どことつながったらインターネットに繋がっていると言えるかの 判断基準を出してくれないと先に進めないと思うよ。
533 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 12:04:41 ] 相手もそうだがプロトコルもな。 ファイアウォールの具合でICMP通らないかもしらんし。
534 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 23:19:33 ] まぁ、スレ違いだな。
535 名前:名無しさん@お腹いっぱい。 [2007/06/04(月) 07:59:35 ] >>527 >if ping -c 1 www.yahoo.com >/dev/null 2>&1; then 関係ないが、この 2>&1 エラー対策でつか?
536 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 14:12:29 ] 遅レスだが、 tail -r ファイル名| tail +20 | tail -r でもいけた(tailばっかりでカッコ悪いか)
537 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 21:46:12 ] >>535 終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
538 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 21:50:18 ] それを捨てるなんて、とんでもない!
539 名前:ウサチャソ mailto:sage [2007/06/04(月) 23:49:23 ] きのうはおたのしみでしたね。 ウホッ
540 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 23:51:56 ] *「おお しんでしまうとは なにごとだ!」 *「アッー!」
541 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/05(火) 06:33:28 ] vmstat 1 の結果の左側に`date +%H:%M:%S`(時分秒)を付けて流して表示させようとしています。 以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは gawkでない為に別の方法が必要です。 どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
542 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/05(火) 08:54:12 ] Perlあるなら vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
543 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/05(火) 08:59:20 ] これは重そうだけど vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
544 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/05(火) 20:13:14 ] >>539-540 DQ I ?
545 名前:541 mailto:sage [2007/06/05(火) 22:31:39 ] >>542 HP-UX10.20だったのですがperlが入っていませんでした(汗 でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。 >>543 readがそんな使い方できるとは知りませんでした。 おかげさまでばっちり動きました。ありがとうございます。
546 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/05(火) 23:39:38 ] bash.infoの説明だと echo hoge | read v で echo $V →hoge になるように読める で、できないってことはわかったんだけど結局readはどう使うんですか なんでwhile中だとうまく動くんでしょう
547 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 00:17:57 ] サブシェルが起動するから。 read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。 while でなくても、下のような書き方をすれば {...} の中にかぎり有効。 echo hoge | { read v echo $v } あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
548 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 15:14:41 ] 質問 シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると 改行がコマンドとして認識され、command not foundとなってしまいます。 普通に改行を改行として認識させることはできないのでしょうか?
549 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 16:33:41 ] よくわからんが改行コードの問題? 改行コードをLFで保存できるテキストエディタ使えよ
550 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 16:52:46 ] >>549 ありがとうとざいます LFで保存したところ大丈夫でした。 ただし1行目だけはなぜかcommand not foundとなってしまう。。
551 名前:名無しさん@お腹いっぱい。 [2007/06/06(水) 20:15:14 ] log=20070101.log $logを 2007-01-01 という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか? どなたか、お力をお貸し下さいませ。 .log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが 方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
552 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 20:26:09 ] echo $log | sed 's/\(....\)\(..\)\(..\).*/\1-\2-\3/'
553 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 20:30:18 ] >>552 ありがとうございました!出来ました! sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz こんなに早く答えて頂いて本当に助かりました。
554 名前:名無しさん@お腹いっぱい。 [2007/06/06(水) 23:42:52 ] じぇっとすとりーーーむ〜
555 名前:名無しさん@お腹いっぱい。 [2007/06/06(水) 23:42:59 ] シェルが何かは分かったのですが、シェルスクリプトが良く分かりません… 専門用語を交えないで言うと、どういったものなのでしょうか?
556 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 23:44:51 ] シェルが何かどうわかったか、専門用語を交えずに説明してからだ
557 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/07(木) 00:11:41 ] レストランのメニューがシェル。コース料理がシェルスクリプト。 大分違うな…
558 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/07(木) 00:35:32 ] e-words.jp/w/E382B7E382A7E383ABE382B9E382AFE383AAE38397E38388.html 専門的な概念なのに専門用語使うなというのは無理な話。
559 名前:名無しさん@お腹いっぱい。 [2007/06/07(木) 02:08:21 ] >>557 その説明で開眼しました!! 今ならどんなプログラムも書けそうです!! (^ω^)
560 名前:名無しさん@お腹いっぱい。 [2007/06/08(金) 00:50:30 ] if [ -e foo ] ; then echo "foo exists." else echo "foo does not exist." fi これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。 でも Solaris 8の shで実行した時だけ test: argument expected と出てしまいます。どうにも分かりません。助けて下さい…