シェルスクリプト総合 その13
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。
2008/10/16(木) 00:48:38スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0951名無しさん@お腹いっぱい。
2009/01/23(金) 23:59:42逆に聞くが、
>>949 のような場合 (ループ中にmv -i がある)
done < list.lst の方式でどうやって書くつもりだよ?
まさかいちいち mv -i < /dev/tty はないだろ?
fd3 (別にfd4以降でもいいが) を使うのが一番美しいだろ?
よって、お前の負け。
0952名無しさん@お腹いっぱい。
2009/01/24(土) 00:01:39何でわざわざ競合する状況にしないといけないのか?
普通に標準入力を読むと、困るのか?
特殊なライブラリを無理にリンクして、
レースコンディションを作る趣味でも有るの?
0953名無しさん@お腹いっぱい。
2009/01/24(土) 00:04:11だから、変なコード書くな。
>>949の様な場合・・を作るな。
0954名無しさん@お腹いっぱい。
2009/01/24(土) 00:05:21おい、mv -i の動作、理解してないのかよ。
done < list.lst
の状態で、mv -i が標準入力を読むと、
list.lstを読んでしまう。
で、ファイルリストが読み飛ばされてめちゃくちゃになるだけでなく、
「y」以外のデータが読めた場合は mv コマンドがキャンセルされる。
全く意図通りに動かない。
まずは、>>951 の質問に答えること。話はそれからだ。
0955名無しさん@お腹いっぱい。
2009/01/24(土) 09:11:15答える必要無し。
なんで、>>949のような場合って言う意味不明の状況に対して、
人様の脳みそを使わせようとするのか?
>>900でfd3を開いて閉じる必然性が無い事について、
「これこれこういう場合に必然性が有る」というのは、
単なる詭弁。
0956名無しさん@お腹いっぱい。
2009/01/24(土) 09:38:06>答える必要無し。
なんだ、答えられないのか。お前、負けを認めたなw
>「これこれこういう場合に必然性が有る」というのは、
>単なる詭弁。
詭弁ではない。
お前自身も、>>931 で、
「それは結局「バグ隠し」に繋がる。」と発言してる。
今現在はバグはなくても、「これこれこういう場合に」にバグが発生する可能性が
あるのをあらかじめ潰しておくことを、お前自身は肯定していたわけだ。
ならば、whileループにおいて、リダイレクトの必要があるのは readだけなのだから、
read以外の、do〜doneの間にあるコマンドはリダイレクトの影響を受けないよう、
標準入力をもとの標準入力のままにしておくことが
将来を見通したバグのないコーディングといえる。
ちなみに、do〜doneの間に mv -i を入れて、インタラクティブに確認するという
スクリプトは、普通にあり得る。
で、そういう場合、fd3を使ってオープンした上で、read 0<&3 で読むというのも、
テクニックとして存在する。
お前は、そのテクニックについて知らなかったわけだ。
0957名無しさん@お腹いっぱい。
2009/01/24(土) 10:09:380958名無しさん@お腹いっぱい。
2009/01/24(土) 10:26:46>>955 は fd3を使ったwhileループのテクニックについて理解できない。
0959名無しさん@お腹いっぱい。
2009/01/24(土) 13:05:59出来ていないのはお前。
というか、お前はシェルスクリプトのあらゆる事が、
まったく理解できていない。
やめてしまえ。
0960名無しさん@お腹いっぱい。
2009/01/24(土) 13:14:13妄想は程々に。
よくもまあ、それだけ嘘ばっかり書けるな。
本当の事が一つも書いていない。
まあ、お前のレスは何時もそうだがな。
0961名無しさん@お腹いっぱい。
2009/01/24(土) 13:44:15だから、>>951 の質問に答えろよ。
論破されて答えられなくなったからと言って、
「答える必要なし」で誤魔化すなよw
>>960 は、
whileループ中のループ本体のコマンドが標準入力を読むこともあるという、
ごく普通の状況すら想像できなかったんだろw
もっと想像力を身に付けろ。
シェルスクリプトは、様々な可能性を考慮してコーディングすること。
あと、>>959,960 には、具体的なことが一言も書かれていない。
つまり、全然反論になっていない。
これは、論破された人間が負け惜しみで書く典型的な文章。
0962名無しさん@お腹いっぱい。
2009/01/24(土) 13:53:070963名無しさん@お腹いっぱい。
2009/01/24(土) 17:11:48結論: 解決済みの質問に的外れな文句付けた>>903が無様。面白いから、もっとやれ。
>>904 解決済みの事をくどく教えたがる。(後ろの方で仮想的を教えたがりと叩いているのが笑える)
>>906, >>910, >>912 恥の上塗り。
>>922 必死に質問者のあらさがし。
>>925 元質問者の質問の一部を取り出して意味不明のレス。
>>928 必死に探しあてた(と確信した)アラにすがる
>>934-935 撤収用意?
>>947, >>950 もはや日本語になっていない
0964名無しさん@お腹いっぱい。
2009/01/24(土) 17:39:22テクニックを知っているにも関わらず、
質問内容自体はごくごく初歩的なのでちょっと驚いた
まわりからシェルスクリプト書くときのルールみたいにして
教え込まれてるのかな?
0965名無しさん@お腹いっぱい。
2009/01/24(土) 18:47:440966名無しさん@お腹いっぱい。
2009/01/25(日) 21:31:320967名無しさん@お腹いっぱい。
2009/01/25(日) 23:34:48do
echo $buf
done < hogehoge
のhogehogeのところをファイルじゃなくてコマンドにすることは可能ですか?
これじゃ無理でしたが、イメージはこんな感じです。
while read buf
do
echo $buf
done < `grep . hogehoge`
0968名無しさん@お腹いっぱい。
2009/01/25(日) 23:37:45do
echo $buf
done
0969名無しさん@お腹いっぱい。
2009/01/25(日) 23:47:06ありがとうございます!
ついでにCSVファイルの各レコードのカラム数を出したいんですが、うまい方法ありますか?
awk -F ' { print NF } ' hoge.csv
でもいいんですが、awkが嫌いなので使いたくないです
0970名無しさん@お腹いっぱい。
2009/01/26(月) 00:10:00sed 's/\\,//' hoge.csv | awk -F, '{ print NF; }'
0971名無しさん@お腹いっぱい。
2009/01/26(月) 00:10:210972名無しさん@お腹いっぱい。
2009/01/26(月) 06:33:55IFS=,
while read line 0<&3
do
set $line
echo $#
done 3< hoge.csv
ちなみに、fd3を使う方式にしといたよw
0973名無しさん@お腹いっぱい。
2009/01/26(月) 11:08:04while read line 0<&4
do
echo ",$line" | tr -cd "," | wc -c
done 4< hoge.csv
0974名無しさん@お腹いっぱい。
2009/01/26(月) 12:31:330975名無しさん@お腹いっぱい。
2009/01/26(月) 12:34:45質問は、
>>969 が言うように、
> awk -F, '{ print NF }' hoge.csv
>でもいいんですが、
なのだから、↑のawkと同等のシェルを作ればいいだけ。
エスケイプなんて余計なことする必要なし。
0976名無しさん@お腹いっぱい。
2009/01/26(月) 12:45:130977名無しさん@お腹いっぱい。
2009/01/26(月) 13:34:54そんなら、とっとと「awkと同等のシェル」作れ。
0978名無しさん@お腹いっぱい。
2009/01/26(月) 13:36:50Excelで読めないようなCSVはCSVとは認めません。
0979名無しさん@お腹いっぱい。
2009/01/26(月) 13:56:43>>972
0980名無しさん@お腹いっぱい。
2009/01/26(月) 13:58:36awkと同等のものがスクリプトなわけないだろ。
シェルでいいんだよ。
0981名無しさん@お腹いっぱい。
2009/01/26(月) 14:55:350982名無しさん@お腹いっぱい。
2009/01/26(月) 22:11:300983名無しさん@お腹いっぱい。
2009/01/26(月) 22:32:210984名無しさん@お腹いっぱい。
2009/01/26(月) 22:35:25>>980
次スレ立ててよ。
0985名無しさん@お腹いっぱい。
2009/01/27(火) 07:24:42次スレでは、>>11 を >>9 のfindの記述のところにマージしてね。
0986名無しさん@お腹いっぱい。
2009/01/27(火) 07:28:040987名無しさん@お腹いっぱい。
2009/01/27(火) 07:46:15とりあえず、>>903が、分かってないのに偉そうなところまで読んだ
レス数が950を超えています。1000を超えると書き込みができなくなります。