- 1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
- 775 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 20:45:09 ]
- よく読まずに余計な突っ込みした >>773 は今ごろ赤面ww
- 776 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:08:40 ]
- >>775
お前のレスうざい
- 777 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:32:45 ]
- OSを秘密にしているのだから、エスパー様の出番だな。
余計な突っ込みした、知恵足らずの>>775は今ごろ赤面ww
- 778 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:41:31 ]
- シェルはOSには依存しないな。
余計な突っ込みした、知恵足らずの>>777 は今ごろ赤面ww
- 779 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 21:43:02 ]
- > シェルはOSには依存しないな。
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。
- 780 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:54:17 ]
- まあよくある願望とごっちゃにしたな
- 781 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:04:17 ]
- たとえば最近の例を引き合いに出すが、
>>757 の質問(OS不明)に >>758 が的確に回答してる。 どこにもOSに依存してるところはないな。 >>757 に対して「OSが秘密じゃ答えられない」なんていってる奴は 無知をさらけ出してる奴。OSがわかったところで答えられないだろう。
- 782 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:06:52 ]
- 全然関係ない事例を持ち出して
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 を誤魔化そうとする>>778憐れ。
- 783 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:08:34 ]
- 本件事例の
>>769 の回答は、OSには依存しないな。
- 784 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:17:34 ]
- 糞みたいな雑談でスレを延ばすなよ
コードで語れ
- 785 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:22:29 ]
- G Em7 Am7 Am7/D D7 G
- 786 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:23:36 ]
- >>769は誤回答。お題は「* で、hogeとかだけにマッチして、hoge.hog にはマッチしない」
- 787 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:25:33 ]
- OSに依存しない誤回答ですね。
- 788 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:45:17 ]
- 誤解答を例示して
> シェルはOSには依存しないな。 を誤魔化そうと必死の>>778憐れ。
- 789 名前:名無しさん@お腹いっぱい。 [2008/05/02(金) 11:38:05 ]
- $ls
test1.jpg test10.jpg test2.jpg test3.jpg test4.jpg test5.jpg test6.jpg test7.jpg test8.jpg test9.jpg と1桁の数字からなる連番ファイルがあるときに $ls test0001.jpg test0002.jpg test0003.jpg test0004.jpg test0005.jpg test0006.jpg test0007.jpg test0008.jpg test0009.jpg test0010.jpg というように4桁の連番ファイルにリネームしたいのですが、 ご教授お願いします。
- 790 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:40:37 ]
- >>789
mv sed printf for これだけ調べればできる
- 791 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:41:07 ]
- 書き忘れた、
test10.jpg これ 1桁の数字じゃないよな
- 792 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:43:03 ]
- >>789
環境依存かつ汎用性ナシだけど、 おれならこうやっちゃう。 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ mv test10.jpg test0010.jpg
- 793 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:49:01 ]
- >>789
#!/bin/sh for file in *.jpg do num=`expr $file : '[^0-9]*\([0-9]*\)'` base=`expr $file : '\([^0-9]*\)'` num=`printf %04d $num` echo mv $file $base$num.jpg done
- 794 名前:789 mailto:sage [2008/05/02(金) 11:52:46 ]
- >>791
最初1桁の例だけ書いてたんで、 2桁も混じっているということを書き忘れました。 >>792 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ for i in {10..99}; do mv test$i.jpg test00$i.jpg; done ってかんじですかね。ありがとうございます。
- 795 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:52:51 ]
- >>790
具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。
- 796 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:53:29 ]
- >>794
>>793
- 797 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:55:18 ]
- 3桁のときは、0を一つ、2桁の時は、0を2つ
一桁のときは、0を3つってつけてけばいいねん sedだけでできる
- 798 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:56:45 ]
- >>797
そんなことをしなくても >>793 で一発。
- 799 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:57:56 ]
- でしたね^^
解決したようで
- 800 名前:793 mailto:sage [2008/05/02(金) 12:09:21 ]
- sedだけでやるならこうかな
↓ #!/bin/sh for file in *.jpg do new=`echo $file | sed 's/[0-9]/0000&/; s/[0-9]*\([0-9][0-9][0-9][0-9]\)/\1/'` mv $file $new done
- 801 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:11:08 ]
- ごちゃごちゃしてるなぁ
- 802 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:13:48 ]
- そう思うならprintfの方がすっきりする
- 803 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:16:28 ]
- カレントディレクトリ配下で自分が所有者のファイルを探してすべて消したいのですが、
どのように書けばいいですか?
- 804 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:17:35 ]
- find . -user `whoami` -exec rm -f {} \;
- 805 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:18:06 ]
- ありがとうございます
試してみます
- 806 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 20:11:05 ]
- >>795
> >>790 > 具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。 お前が真っ先に黙れ。
- 807 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 12:08:46 ]
- 若干スレ違いですが、
シェルスクリプラーなみなさんが詳しそうなので質問させてください。 unix,linuxで、 カーネルの脆弱性なんかでrootに権限昇格の可能性があるのって 特定コマンドを利用不可にしていたら難しい、 なんてことあるでしょうか? また、特定コマンドを利用した回数、利用したユーザ、 とか調べる方法ってないでしょうか?
- 808 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:02:50 ]
- つ BSD acct & lastcomm
- 809 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:55:52 ]
- >>807-809
具体例を出さない書き込みは禁止。
- 810 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:43:33 ]
- 若干どころじゃなくスレ違い。
- 811 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:47:30 ]
- 「シェルスクリプロ」って何ですか?
- 812 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:57:16 ]
- シェルスクリプる
- 813 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 08:56:10 ]
- a 5 9 2
b 7 3 6 c 5 3 2 d 8 3 7 e 4 4 4 のようなテキストファイルから a 5 9 2 16 b 7 3 6 16 c 5 3 2 10 d 8 3 7 18 e 4 4 4 12 のように行の値の合計を右端に出力したいのですがどうしたらできますか? awk '{print $1,$2,$3,$4,$1+$2+$3}' のようにではなく、列の値の数が3でなくても対応できるようにしたいです。
- 814 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:01:46 ]
- >>813
簡単だね。 #!/bin/sh while read line do set $line shift sum=0 for i in "$@" do sum=`expr $sum + $i` done echo "$line $sum" done < file
- 815 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:20:27 ]
- 適当にがんばってみたらできたました。
ありがとうございました。 awk '{sum=0;for(i=1;i<=NF;i++)sum+=$i; print $"$i",sum}' test.txt
- 816 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:38:50 ]
- >>815
ちゃんと「シェルで」答えてくれた >>814 に礼もなしで 自己解決かよ。 しかも、awkでやるならスレ違い。awkスクリプトはシェルスクリプトにあらず。
- 817 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:41:33 ]
- おいおい、 >>815 の awkだと間違ってるぞ。
1列目の文字がたまたま数値的に 0 と評価されたら 結果的に正しく動いてるように見えるけど、 1列目に数値と解釈される文字があったらアウト。 このスレ的には >>814 が正解。
- 818 名前:名無しさん@お腹いっぱい。 [2008/05/06(火) 20:45:33 ]
- unix初心者ですが、シェルについて教えてください。
if文で、if〜then〜else〜endif を使用しています。 if文の判定は、ファイル有無の判定です。 判定対象のファイルを正規表現で記述すると、elseまで辿り着きますが、 メタキャラ"?"で判定すると、elseまで辿り着かず、 「照合パターンに合いません」 と出力され終了してしまいます。 シェルの構文は下記の通りです。 #!/bin/csh if ( -f /tmp/a?a.log ) then echo "ファイルが見付かりました" else echo "ファイルが見付かりませんでした" endif メタキャラを使用して、ファイル判定をする方法を教えて頂けませんでしょうか。 宜しくお願い致します。
- 819 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 20:50:12 ]
- >>818
cshでスクリプトを作ってはいけません。 どうしてもcshが良いなら独学でどうぞ。
- 820 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:05:42 ]
- >>818
#!/bin/sh if [ -f /tmp/a?a.log ]; then echo 'ファイルが見付かりました' else echo 'ファイルが見付かりませんでした' fi
- 821 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:15:22 ]
- #!/bin/sh
[ -f /tmp/a?a.log ] && { echo 'ファイルが見付かりました' } || { echo 'ファイルが見付かりませんでした' }
- 822 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:19:42 ]
- #!/bin/sh
s=; [ -f /tmp/a?a.log ] || s='せんで'; echo 'ファイルが見付かりま'"$s"'した'
- 823 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:27:57 ]
- s=;(</tmp/a?a.log)2>/dev/null||s='せんで';echo 'ファイルが見付かりま'"$s"'した'
- 824 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:16:35 ]
- ゴルファーがいるw
- 825 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:21:36 ]
- すんません、検索したけど見つからなかったので教えてください。
bash + awk, bc, perl あたりで、小数部が3桁の計算をして、 その結果を変数に格納してます。その後、その変数の値を 絶対値にして返してくれるコマンドはありませんか? 上記のbash, awk, bc, perl あたりでできれば一番良いのですが。 よろしくお願いしまつ。
- 826 名前:名無しさん@お腹いっぱい。 [2008/05/06(火) 22:44:52 ]
- > 820、821
ありがとうございました。 Bシェルで作成します。 … 作成したのですが、複数ファイルがマッチした場合、 ファイル名: binary operator expected が表示され、マッチしたにも関わらず、elseが適用されます…。 ご存知でしたら、複数マッチしても、真となるような方法を教えて頂けませんでしょうか。
- 827 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:58:20 ]
- >>825
マイナス符号を取ったらいいだけだろ $ var1=-123.456 $ expr $var : '-*\(.*\)' 123.456 $ var2=123.456 $ expr $var : '-*\(.*\)' 123.456
- 828 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:01:42 ]
- >>826
#!/bin/sh if ls /tmp/a?a.log 2>/dev/null; then echo 'ファイルが見付かりました' else echo 'ファイルが見付かりませんでした' fi
- 829 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:14:46 ]
- >>825
$ var=-123.456 $ echo ${var#-} 123.456 $ var=123.456 $ echo ${var#-} 123.456
- 830 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:22:26 ]
- bash依存乙。
- 831 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 23:29:02 ]
- だからksh由来だと何度(ry
まあテンプレにもあるようにsh以外ならそう明記すべきだな。
- 832 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:40:42 ]
- カレントディレクトリ配下のファイルにsedをかけたいのですが、
どのようにしたらできますか?
- 833 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:50:19 ]
- >>832
要エスパー質問だなw for file in * do sed 's/hoge/hage' "$file" > "$file".new done てことをやりたいのか?
- 834 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:54:09 ]
- >>832
OSやシェルの種類/バージョンは秘密ですか? それを秘密にしたままでは誰も答えられないでしょう。 このレス以外、レスは0件でしょう。
- 835 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 11:58:42 ]
- OSはわかりません。(アウトソーシングでunameが使えないため)
ShellはBashです。 $ bash --version GNU bash, version 3.1.17(1)-release >>833 それだと、カレントディレクトリのファイルしか置き換えできません。 カレントディレクトリ配下をすべて置き換えたいです。 また、置き換えしたいので、.newファイルを作成したいのではないです。 (名前を変更すればいいだけですが。)
- 836 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:02:49 ]
- >>835
find . -type f -exec sed -i 's/hoge/hage' {} \;
- 837 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:06:32 ]
- >>834
OS関係ないだろw すでに適切な回答がなされた後で再読み込みもせずに余計なことを書いた >>834 は今ごろ赤面。
- 838 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 12:09:01 ]
- >>835
「カレントディレクトリ配下」という言葉の使い方を間違ってます。
- 839 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 14:40:31 ]
- >>832, >>834-835, >>837-839
具体例を出さない書き込みは禁止。
- 840 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:20:43 ]
- >>838
配下っていう意味的にはあってるでしょ
- 841 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:21:36 ]
- >>840
合ってない。直下のディレクトリのみ指す用語。
- 842 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:24:34 ]
- >>841
配下って言うのは、傘下って意味。 参加は直下以外も指す。 ダイハツの下もTOYOTAの傘下でしょ。
- 843 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:39:44 ]
- >>842
勝手に言葉を定義されても、困るのですが。
- 844 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:46:27 ]
- その人の支配に属していること。また、その者。手下。部下。
- 三省堂提供「大辞林 第二版」より 類語: ⇒ 関連語 てした【手下】 ⇒ 関連語 さんか【傘下】 ⇒ 関連語 したやく【下役】 - YAHOO辞書より
- 845 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:47:48 ]
- 一言「サブディレクトリ以下も含む」と付け加えれば意味が通じたのに、
>>832 は「サブディレクトリ」という用語を知らないに1票。
- 846 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 18:52:45 ]
- 例えば、
/aaa/bbb というディレクトリがあって、 touch /aaa/bbb/ccc.txt ってやりたい時、 bbbディレクトリに書き込みパーミッションがあれば、 aaaディレクトリは書き込み禁止であっても書き込める。 よって、bbbはaaaに支配されているわけではない。 aaa自体の書き込みパーミッションは、 aaa直下に作成するファイルにしか効かない。 つまり、bbbはaaaの支配には属していない。
- 847 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:10:11 ]
- 基本的には親ディレクトリを削除したら下は全部削除されるんだから支配されてるでしょ。
孫請け会社が親とは直接的なやり取りがないのとおなじ
- 848 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:19:12 ]
- リンク
- 849 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:19:17 ]
- >>846 >>847
だから、勝手に言葉を定義されても困るのですが。 >>845 「再帰的(reccursive)に」というキーワードがありますね。 よくあるオプションは-rですか。
- 850 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:21:22 ]
- -Rだな
- 851 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:33:05 ]
- >>849
言葉を定義してるはあなたも同じでしょ。 YAHOO辞書に従うと、類義で傘下があるから傘下としてはただしいんだし。
- 852 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 19:42:10 ]
- >>851
いや、してませんけど。 言葉は流動的なもので、大辞林や広辞苑にこう書かれている、としても、 それがすべての場合に同様に正確にあてはまるわけではないのは、日常の 言葉のやりとりで体得していないのですか? プログラム言語じゃあるまいし。
- 853 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 20:20:38 ]
- >>847
逆。下のディレクトリがあると親ディレクトリは削除できない。 そういう意味では子に親が支配されてる。 あと、NFSとかnullfsでループバックマウントする場合、 子のディレクトリを別の場所にマウントすると まさに親ディレクトリに関係なく子のディレクトリにアクセスできる。 ディレクトリ間は単にリンクしあっているだけであって、支配関係はない。
- 854 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 22:40:38 ]
- >>852
指標にはなるでしょ。 根拠をしめしてるだけ、ちゃんと示してる。 >>853 削除できないようにしてるだけ。
- 855 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/07(水) 22:59:03 ]
- いったいなんのスレだここはw
- 856 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/08(木) 05:17:48 ]
- こういう宗教戦争があるのがUNIX板のいいところ
- 857 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/08(木) 08:25:57 ]
- どうでもいいが、>>836 で正解もらってるのに、
>>835 = >>832 から礼の一言もなしに書き逃げしてるなw
|

|