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

このエントリーをはてなブックマークに追加
938名無しさん@お腹いっぱい。:2009/01/21(水) 23:58:52
要件定義や要求仕様より、
スクリプトが正しく動くかのほうが大事。

それがこのスレの存在意義。
939名無しさん@お腹いっぱい。:2009/01/22(木) 06:31:53
いくら教えたがりでも、
type -p や md5sumについて知らなかったり、
「コマンド置換」の用語を知らなかったり、
「別ファイルに出力」という要件を読み落すような
レベルの低い教えたがりは要らないな。

あと、本題のmd5sumのコマンドラインの修正点について一切答えず、
本題に関係ない部分の突っ込みばかり入れる
>>903 みたいな教えたがりは要らないな。

>>901 が先に本題の解答をしていなかったら、
>>903 によって、本題以外の突っ込みばかりで
質問者が潰されていたことだろう。
940名無しさん@お腹いっぱい。:2009/01/22(木) 07:03:54
>>928
fd3を開いて閉じる必然性:

while ...
do
:
done < list.lst
の方式では、whileループの中で(readコマンド以外が)
もし本来の標準入力を読む必要があった場合、読めなくなってしまう。

かと言って、while read file < list.lst と書いてしまうと、
ループのたびに list.lstがオープンし直されて頭から読み直されるから正常動作しない。

そこで、exec 3<list.lst で、あらかじめ list.lstをオープンしたままにしておき、
while read file 0<&3 で、readコマンドだけにリダイレクトする。

0<&3は単なるファイル記述子の複製だから、read ... <list.lst とは違って、
ファイルを頭から読み直さないから、正常動作する。

whileループを抜けたら、fd3は必要なくなるので、
exec 3<&- で閉じる。

以上、必然性は認められる。
941名無しさん@お腹いっぱい。:2009/01/22(木) 11:27:47
まとめると、>>646>>645を理解できない。
942名無しさん@お腹いっぱい。:2009/01/22(木) 12:50:43
read a
ってやると行頭の空白が $a に入らないんだけど、
うまく空白まで拾う方法ってないんだっけ?
943名無しさん@お腹いっぱい。:2009/01/22(木) 12:53:44
>>942
IFS= read a
944名無しさん@お腹いっぱい。:2009/01/22(木) 13:00:46
おー、でけた。ありがと。
945名無しさん@お腹いっぱい。:2009/01/22(木) 13:04:26
>>942,943

行頭の空白を拾わないと言う認識だと、
そもそも全然別物なので、
比較検討再構成的な学習法が成立しない。

ようは、デリミタ展開の問題でしょ。
946名無しさん@お腹いっぱい。:2009/01/22(木) 13:37:08
>>945
お前まだいたのかw

質問が解決した「後」で蛇足な書き込みする前に、正しい用語覚えろ。

× デリミタ展開
○ 単語分割(word splitting)
947名無しさん@お腹いっぱい。:2009/01/23(金) 23:29:51
>>もし本来の標準入力を読む必要があった場合、読めなくなってしまう。

アフォのこじつけ丸出し。

while read って書いたのは誰だ?
以外のコマンドって何だ?
読む必要とは?

おまいは、コマンドの指示に従ってスクリプトを書くのか?
本末転倒。
948名無しさん@お腹いっぱい。:2009/01/23(金) 23:32:58
>>945,946

見苦しい自演でご苦労ですな。

しったかをするために、
更に無知な人間をでっち上げるとは、
たいした念の入り様だ。

死ねカス。
949名無しさん@お腹いっぱい。:2009/01/23(金) 23:35:21
>>947
意味わかってる?
本来の標準入力を読むのは、readじゃなくて、
whileループ内の、do 〜 done の間のコマンドのことだよ。

while read file
do
mv -i "$file" "$file"-hoge
done < list.lst

みたいな場合、mv -i コマンドが確認のために標準入力を読んでしまう。
これが、< list.lstと競合して正常動作しない。

これを回避するために fd3 を使う。
950名無しさん@お腹いっぱい。:2009/01/23(金) 23:56:03
>>949

まさに、牽強付会。
read がリダイレクトを読むのが前提で、
do以下が読むのを「本来の」ってのが、無理やりだ。

意味分かってる?
951名無しさん@お腹いっぱい。:2009/01/23(金) 23:59:42
>>950
逆に聞くが、

>>949 のような場合 (ループ中にmv -i がある)
done < list.lst の方式でどうやって書くつもりだよ?
まさかいちいち mv -i < /dev/tty はないだろ?

fd3 (別にfd4以降でもいいが) を使うのが一番美しいだろ?

よって、お前の負け。
952名無しさん@お腹いっぱい。:2009/01/24(土) 00:01:39
てか、まさにfd3が不要だろ。

何でわざわざ競合する状況にしないといけないのか?

普通に標準入力を読むと、困るのか?
特殊なライブラリを無理にリンクして、
レースコンディションを作る趣味でも有るの?
953名無しさん@お腹いっぱい。:2009/01/24(土) 00:04:11
>>950

だから、変なコード書くな。

>>949の様な場合・・を作るな。
954名無しさん@お腹いっぱい。:2009/01/24(土) 00:05:21
>>952
おい、mv -i の動作、理解してないのかよ。

done < list.lst
の状態で、mv -i が標準入力を読むと、
list.lstを読んでしまう。
で、ファイルリストが読み飛ばされてめちゃくちゃになるだけでなく、
「y」以外のデータが読めた場合は mv コマンドがキャンセルされる。
全く意図通りに動かない。

まずは、>>951 の質問に答えること。話はそれからだ。
955名無しさん@お腹いっぱい。:2009/01/24(土) 09:11:15
>>まずは、>>951 の質問に答えること。話はそれからだ。

答える必要無し。

なんで、>>949のような場合って言う意味不明の状況に対して、
人様の脳みそを使わせようとするのか?

>>900でfd3を開いて閉じる必然性が無い事について、
「これこれこういう場合に必然性が有る」というのは、
単なる詭弁。
956名無しさん@お腹いっぱい。:2009/01/24(土) 09:38:06
>>955
>答える必要無し。

なんだ、答えられないのか。お前、負けを認めたなw


>「これこれこういう場合に必然性が有る」というのは、
>単なる詭弁。

詭弁ではない。
お前自身も、>>931 で、
「それは結局「バグ隠し」に繋がる。」と発言してる。
今現在はバグはなくても、「これこれこういう場合に」にバグが発生する可能性が
あるのをあらかじめ潰しておくことを、お前自身は肯定していたわけだ。

ならば、whileループにおいて、リダイレクトの必要があるのは readだけなのだから、
read以外の、do〜doneの間にあるコマンドはリダイレクトの影響を受けないよう、
標準入力をもとの標準入力のままにしておくことが
将来を見通したバグのないコーディングといえる。

ちなみに、do〜doneの間に mv -i を入れて、インタラクティブに確認するという
スクリプトは、普通にあり得る。

で、そういう場合、fd3を使ってオープンした上で、read 0<&3 で読むというのも、
テクニックとして存在する。

お前は、そのテクニックについて知らなかったわけだ。
957名無しさん@お腹いっぱい。:2009/01/24(土) 10:09:38
なんでも勝ち負けで物事を見るって団塊の世代かよ
958名無しさん@お腹いっぱい。:2009/01/24(土) 10:26:46
一言でまとめると、
>>955 は fd3を使ったwhileループのテクニックについて理解できない。
959名無しさん@お腹いっぱい。:2009/01/24(土) 13:05:59
>>958

出来ていないのはお前。

というか、お前はシェルスクリプトのあらゆる事が、
まったく理解できていない。

やめてしまえ。
960名無しさん@お腹いっぱい。:2009/01/24(土) 13:14:13
>>956

妄想は程々に。

よくもまあ、それだけ嘘ばっかり書けるな。

本当の事が一つも書いていない。
まあ、お前のレスは何時もそうだがな。
961名無しさん@お腹いっぱい。:2009/01/24(土) 13:44:15
>>960
だから、>>951 の質問に答えろよ。

論破されて答えられなくなったからと言って、
「答える必要なし」で誤魔化すなよw

>>960 は、
whileループ中のループ本体のコマンドが標準入力を読むこともあるという、
ごく普通の状況すら想像できなかったんだろw
もっと想像力を身に付けろ。
シェルスクリプトは、様々な可能性を考慮してコーディングすること。


あと、>>959,960 には、具体的なことが一言も書かれていない。
つまり、全然反論になっていない。
これは、論破された人間が負け惜しみで書く典型的な文章。
962名無しさん@お腹いっぱい。:2009/01/24(土) 13:53:07
もう俺以外は全員勝ちでいいよ
963名無しさん@お腹いっぱい。:2009/01/24(土) 17:11:48
楽しく傍観してたが、読み返してみた。
結論: 解決済みの質問に的外れな文句付けた>>903が無様。面白いから、もっとやれ。

>>904 解決済みの事をくどく教えたがる。(後ろの方で仮想的を教えたがりと叩いているのが笑える)
>>906, >>910, >>912 恥の上塗り。
>>922 必死に質問者のあらさがし。
>>925 元質問者の質問の一部を取り出して意味不明のレス。
>>928 必死に探しあてた(と確信した)アラにすがる
>>934-935 撤収用意?
>>947, >>950 もはや日本語になっていない
964名無しさん@お腹いっぱい。:2009/01/24(土) 17:39:22
>>900がIFSを変更したり、ディスクリプタ3番をexecで開いたり閉じたりという
テクニックを知っているにも関わらず、
質問内容自体はごくごく初歩的なのでちょっと驚いた

まわりからシェルスクリプト書くときのルールみたいにして
教え込まれてるのかな?
965名無しさん@お腹いっぱい。:2009/01/24(土) 18:47:44
おそらく、他のスクリプトからコピペしてきたんだと思う。
966名無しさん@お腹いっぱい。:2009/01/25(日) 21:31:32
>>903に釈明カキコを要求しとく。
967名無しさん@お腹いっぱい。:2009/01/25(日) 23:34:48
while read buf
do
echo $buf
done < hogehoge
のhogehogeのところをファイルじゃなくてコマンドにすることは可能ですか?

これじゃ無理でしたが、イメージはこんな感じです。
while read buf
do
echo $buf
done < `grep . hogehoge`

968名無しさん@お腹いっぱい。:2009/01/25(日) 23:37:45
grep . hogehoge | while read buf
do
echo $buf
done
969名無しさん@お腹いっぱい。:2009/01/25(日) 23:47:06
>>968
ありがとうございます!

ついでにCSVファイルの各レコードのカラム数を出したいんですが、うまい方法ありますか?
awk -F ' { print NF } ' hoge.csv
でもいいんですが、awkが嫌いなので使いたくないです
970名無しさん@お腹いっぱい。:2009/01/26(月) 00:10:00
>>969
sed 's/\\,//' hoge.csv | awk -F, '{ print NF; }'
971名無しさん@お腹いっぱい。:2009/01/26(月) 00:10:21
Text::CSV_XS
972名無しさん@お腹いっぱい。:2009/01/26(月) 06:33:55
>>969

IFS=,
while read line 0<&3
do
set $line
echo $#
done 3< hoge.csv


ちなみに、fd3を使う方式にしといたよw
973名無しさん@お腹いっぱい。:2009/01/26(月) 11:08:04
なら俺はfd4を使う方式で

while read line 0<&4
do
echo ",$line" | tr -cd "," | wc -c
done 4< hoge.csv
974名無しさん@お腹いっぱい。:2009/01/26(月) 12:31:33
fd?言う前に、"\,"エスケイプくらい処理しろ。
975名無しさん@お腹いっぱい。:2009/01/26(月) 12:34:45
>>974
質問は、

>>969 が言うように、
> awk -F, '{ print NF }' hoge.csv
>でもいいんですが、

なのだから、↑のawkと同等のシェルを作ればいいだけ。
エスケイプなんて余計なことする必要なし。
976名無しさん@お腹いっぱい。:2009/01/26(月) 12:45:13
スクリプトを略すな
977名無しさん@お腹いっぱい。:2009/01/26(月) 13:34:54
>>975
そんなら、とっとと「awkと同等のシェル」作れ。
978名無しさん@お腹いっぱい。:2009/01/26(月) 13:36:50
>>974
Excelで読めないようなCSVはCSVとは認めません。
979名無しさん@お腹いっぱい。:2009/01/26(月) 13:56:43
980名無しさん@お腹いっぱい。:2009/01/26(月) 13:58:36
>>976
awkと同等のものがスクリプトなわけないだろ。
シェルでいいんだよ。
981名無しさん@お腹いっぱい。:2009/01/26(月) 14:55:35
シェルとも限らないのでは
982名無しさん@お腹いっぱい。:2009/01/26(月) 22:11:30
おでん?
983名無しさん@お腹いっぱい。:2009/01/26(月) 22:32:21
おでん!?
984名無しさん@お腹いっぱい。:2009/01/26(月) 22:35:25
今の時期はやっぱりおでんじゃない?
>>980
次スレ立ててよ。
985名無しさん@お腹いっぱい。:2009/01/27(火) 07:24:42
>>980
次スレでは、>>11>>9 のfindの記述のところにマージしてね。
986名無しさん@お腹いっぱい。:2009/01/27(火) 07:28:04
>>12も忘れるな
987名無しさん@お腹いっぱい。
スレ伸びてるなーと思ってきたが

とりあえず、>>903が、分かってないのに偉そうなところまで読んだ