トップページunix
987コメント345KB

シェルスクリプト総合 その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/
0881名無しさん@お腹いっぱい。2009/01/21(水) 06:40:16
>>880
bash限定なら、

#!/bin/bash
echo -n 'コマンド? '
read comm
md5sum `type -p $comm`
0882名無しさん@お腹いっぱい。2009/01/21(水) 07:53:05
>>876
ありがとうございました。できました。

>>875
質問をちゃんと読んでください。
0883名無しさん@お腹いっぱい。2009/01/21(水) 08:12:30
>>876
>p10とか2桁とかならない範囲なら
なに、この素人

2桁でもできる方法もかけないならプロじゃない。

と素人のおれがいってみる。
0884名無しさん@お腹いっぱい。2009/01/21(水) 10:03:34
必要な時になおせばよい。こういう言い訳が蓄積されて2000年問題が起こった。
0885名無しさん@お腹いっぱい。2009/01/21(水) 10:12:46
>>884
2000年問題とは話が違う。
FreeBSD 5.xはもうEOLになるし、
そもそもシェルスクリプトというのはその場で動けばいいものを
「書き捨て」で書くもの。
0886名無しさん@お腹いっぱい。2009/01/21(水) 10:13:42
質問者はなんちゃってスクリプトで満足したようなので、
後は捏ねくり回したい人たちでどぞー↓
0887名無しさん@お腹いっぱい。2009/01/21(水) 10:17:22
>>884
たとえが悪過ぎ。

ちなみに、2000年問題は、騒がれていたほどの問題は起きず。
ほとんど無害で2000年を迎えた経過した。
2000年問題対策でかかった費用は実は必要なかったことが後でわかった。
むしろ、2000年問題対策と称して儲ける業者がいたことの方が問題。
0888名無しさん@お腹いっぱい。2009/01/21(水) 10:17:52
書き捨てだけじゃなくて、手順を忘れないメモとしても書くぞ。こっちの方が多い。
0889名無しさん@お腹いっぱい。2009/01/21(水) 10:19:33
>>885
あの騒ぎ自体を「2000年問題」と言っている。
0890名無しさん@お腹いっぱい。2009/01/21(水) 10:19:56
ノウハウは自分自身の頭の中に持つもの。
メモは残してはいけない。
変にメモを残して別の担当者に引き継がれると困る。
自分が辞めたらだれもやりかたがわからなくなるのが望ましい。
だから会社は自分を辞めさせられない。
0891名無しさん@お腹いっぱい。2009/01/21(水) 10:54:16
ノウハウってのは惜しみなく与える人の元に集まってくるんだよ。
0892名無しさん@お腹いっぱい。2009/01/21(水) 11:11:01
>>891
それ、昔の考え。
0893名無しさん@お腹いっぱい。2009/01/21(水) 14:50:43
自分の仕事を他人に割り当てるのではなく、
仕事がすべて自分に割り当てられる。
典型的な下っ端ですね。
0894名無しさん@お腹いっぱい。2009/01/21(水) 16:28:23
>>881
お答えありがとうございます。そのまま書いて実行してみたのですが
そのようなファイルやディレクトリはありませんと出てしまいました。
なんとかなりませんか?
0895名無しさん@お腹いっぱい。2009/01/21(水) 16:37:29
>>894
bashをインストールしていない(/bin/bashがない)のでは?

/bin/bashがないのに #!/bin/bash スクリプトを実行しようとすると、
「そのようなファイルやディレクトリはありません」と出るよ。
0896名無しさん@お腹いっぱい。2009/01/21(水) 16:41:16
自分の仕事を他人に割り当てて楽していた中間管理職はリストラされて行ったけどね
0897名無しさん@お腹いっぱい。2009/01/21(水) 18:03:31
>>895
/bin/bashはあるみたいです。
自分のやりかたが悪いのでしょうか・・・
0898名無しさん@お腹いっぱい。2009/01/21(水) 18:05:33
改行コードは?
0899名無しさん@お腹いっぱい。2009/01/21(水) 18:16:41
あ、それか。/bin/bash^M というファイルを実行しようとするんだよな。

/bin/bash^M というシンボリックリンクを本当に作っておくという方法もあり。
0900名無しさん@お腹いっぱい。2009/01/21(水) 18:39:25
>>899
ありがとうございます。教えていただいたのを参考に
組み込んでみたところハッシュ値は取ってくるようになりました。
以下に書いたのが自分で書いてみたものの一部なのですが
取ってくるハッシュ値と実際にターミナル上でみたハッシュ値が
違うのですが、何が原因でしょうか?

シェルスクリプトはlist.lstに書いてあるコマンドを読んで
ハッシュ値をcachというフォルダにコマンド名で保存するというものなのですが
例えばlist.lstにfindと書いておくとこのスクリプトだと
e1b58755ded5d89cd50789f850232111と出るのにターミナル上でmd5sum findすると
4c66ef9549b37df90fb36ebc06f88ef0と出ます。何度もすいません・・・

#!/bin/sh
BUFIFS=$IFS
IFS=
exec 3<list.lst
while read file 0<&3
do
type -p "$file" | md5sum> cach/"$file".txt
echo "$file [ ok ]"
done

exec 3<&-
IFS=$BUFIFS
echo -e "\n"
0901名無しさん@お腹いっぱい。2009/01/21(水) 18:53:00
>>900
パイプとコマンド置換を混同してるね

× type -p "$file" | md5sum> cach/"$file".txt

○ md5sum `type -p "$file"` > cach/"$file".txt
0902名無しさん@お腹いっぱい。2009/01/21(水) 18:57:10
>>901
ありがとうございます。できました。
パイプとコマンド置換について勉強しなおします。
本当にありがとうございました。
0903名無しさん@お腹いっぱい。2009/01/21(水) 20:20:03
>>901,902

パイプとコマンド置換の違いと言う認識だと、
そもそも全然別物なので、
比較検討再構成的な学習法が成立しない。

ようは、引数と標準入力の違いでしょ。
09049032009/01/21(水) 20:24:45
$ echo `echo hoge`
hoge
$ echo 'hoge' | echo

$ echo 'hoge' | cat
hoge
$ cat `echo hoge`
cat: hoge: No such file or directory
$

って事でしょ。
0905名無しさん@お腹いっぱい。2009/01/21(水) 20:54:48
>>903-904 は何を蛇足な説明してるんだ? すでに解決してるのに。
09069032009/01/21(水) 21:00:01
しかし、

type とか md5sum って、

どこのOSの話だ?

/bin/bash とかも、変だぞ。

パイプとかコマンド展開とか標準入力とか以前に、
使用するOSとシェルを間違えていませんか?
0907名無しさん@お腹いっぱい。2009/01/21(水) 21:03:00
>>906
おまえ、面白くないからもう書かなくていいよ。

md5sumはともかく、typeコマンド自体は純正シェルにある純正コマンド。
(-pオプションはないけどね)

「コマンド展開」とか間違った用語使わずに、用語も正確に覚えようね。
0908名無しさん@お腹いっぱい。2009/01/21(水) 21:05:49
md5sumはあちこちのソフトウェア配布サイトで使われてるが…
0909名無しさん@お腹いっぱい。2009/01/21(水) 21:10:31
openssl md5 < `type -p "$file"`

とでも書いて欲しかったのかな?

もちろん、そんなことは知った上で、質問者のレベルを推定し、
質問者に合った回答をするのが上級な回答者。
09109032009/01/21(水) 21:25:52
ああ、type は無問題か。


>>905

間違った解決は良くない。

#!/bin/sh

md5 `type -p \`cat list.lst\``

コマンド展開は普通に使うだろ、
チルダ展開と
変数展開と同列のレイヤーの処理だ。
0911名無しさん@お腹いっぱい。2009/01/21(水) 21:29:57
>>910
どこも間違ってないよ。

>>901 よりも早く回答を出せなかったくせに、
後から何言っても言い訳にしかならない。

あと、typeコマンドも知らなかったというお前の程度がこれで知れた。

× コマンド展開
○ コマンド置換(command substitution)

ちなみにチルダ展開は tilde expansion だから、「展開」でよい。

substitutionとexpansionをちゃんと用語として区別すること。
09129032009/01/21(水) 21:36:25
間違っている。

ファイル記述子の扱いが二重に無駄。
exec が無駄。while が無駄。
なのにスルーして、手前味噌の話に誘導。

md5sum(そんなコマンド知らんが)の引数と標準入力の
扱いの違いを言及していないで、コマンド展開とパイプの話にすり替えている。

嘘だらけ。
0913名無しさん@お腹いっぱい。2009/01/21(水) 21:41:33
md5は知っててmd5sumは知らないってことはBSDしか使ったことないのか?
0914名無しさん@お腹いっぱい。2009/01/21(水) 21:41:57
>>912
「引数と標準入力の違い」という言い方では、質問者には意味が通じにくい。
で、問題が解決した後で、質問者が「引数と標準入力について勉強してみます」
と言ったとしても、「引数と標準入力」では範囲が広過ぎて、
具体的なパイプやコマンド置換の用法の話に直接結び付かない。

こういう場合は、「パイプとコマンド置換の違い」と、単刀直入に説明するのが、
よい解説者。これなら、後で質問者が、パイプやコマンド置換について、
直接調べて勉強することができる。
0915名無しさん@お腹いっぱい。2009/01/21(水) 21:46:55
>>912
へ。
>>900 の元のスクリプト、もう一度良く見てみろ。
ファイル毎に別々のファイルにmd5を出力してるんだよ。
そうやって質問してるんだから、別々のファイルへの出力が要求仕様。

それに対し、お前の >>910 の例では、1つのファイルにmd5を書き出すから、
仕様を満たしていない。

whileは無駄ではない。この仕様の場合には必要。
0916名無しさん@お腹いっぱい。2009/01/21(水) 21:49:07
まとめると、>>646>>645を理解できない。
09179032009/01/21(水) 21:50:49
>>913

犬もsolも使った事があると言う程度だが、悪いか?
白痴じゃないから、md5sum位はググればすぐに分かるが、
敢えて、/bin/bashという設定に反発しただけで、(typeが勇み足)
真面目にとるな。

>>914

いや、そこが大事。
別に引数と言う概念全般とか標準入力全般やfd0の話ではなく、
あるコマンドが、引数や標準入力をどう扱うかという話しであり、
その方が明らかに調べやすい。
09189032009/01/21(水) 21:54:43
>>915

なら、doneの後ろでリダイレクトで十分。
そうしても尚、無駄は残るがね。

>>916

気をつけた方がいい。
職を失うだけでは済まないかも?
0919名無しさん@お腹いっぱい。2009/01/21(水) 21:55:27
コマンドが引数や標準入力をどう扱うかをいくら調べても、
シェルのコマンド置換には行きつかない。
そもそもコマンド置換自体の存在を知らないと、
そういう使い方ができることすらわからない。
だから、「引数と標準入力」じゃなく、「パイプとコマンド置換」と
説明した方がよいことは明らか。
0920名無しさん@お腹いっぱい。2009/01/21(水) 21:58:49
>>918
> doneの後ろでリダイレクトで十分。

もちろんそんなこと知ってるよ。
でもそこは質問のポイントではないので、
焦点をぼかさないように敢えて答えない。

問題になっているのはなぜmd5sumがちゃんと動かないか、だから、
その点を回答すれば良い。
0921名無しさん@お腹いっぱい。2009/01/21(水) 22:02:52
>>912
それを言うなら、IFSだって、わざわざ別変数にバックアップして戻す必要はない。
(どうせシェルを抜ければ関係ないから)

しかし、質問は「このシェルスクリプトの無駄な部分を改良してください」
ではないのだから、そういうことはあえて回答しない。
09229032009/01/21(水) 22:05:10
>>920

そんないい加減な。

全体がおかしいいんだから、きちんと添削しないと駄目だろ。

それに、>>900の、list.lst のフォーマットも未分明だし、
find と言う行が含まれるのか、
find とだけ書いてあるのかも、
あれだけじゃどちらともとれる。

>>問題になっているのはなぜmd5sumがちゃんと動かないか

こういうのをまさしく手前味噌と言うのだよ。
0923名無しさん@お腹いっぱい。2009/01/21(水) 22:08:26
>>922

>>900 より引用
>取ってくるハッシュ値と実際にターミナル上でみたハッシュ値が
>違うのですが、何が原因でしょうか?

ハッシュ値=md5sum値

として、質問者が聞いているのは md5sumがなぜ違ってしまうか、の点ですね。
その質問にダイレクトに答えてるだけですね。
(手前味噌ではありませんね)

「全体をきちんと添削してください」なんて質問していませんねw
09249032009/01/21(水) 22:08:59
>>921

ああ、それもおかしいな。
当然、添削すべき。
単にこちらが、書き漏らしただけだが、
少なくとも、普通は「全部論外」と切って捨てるだろ。

要するに、アピールしたいことの為に
目をつぶったのが正解だろ?
09259032009/01/21(水) 22:16:12
>>923

>>何が原因でしょうか?

普通は、それ以前の問題と回答するのが本当の親切。
部分的に正解を教えても、他が論外なのをスルーしたら
質問者が勘違いする元。

ようは、知っている自慢、教えたがりの自己満足。
0926名無しさん@お腹いっぱい。2009/01/21(水) 22:24:49
>>925

>>900 の質問の場合、「それ以前の問題」ではないぞ。
スクリプトは無駄があるとはいえ、
>>901 が回答した急所の1行以外は正常に動作している。
そして、>>901 の回答によって全体が正常に動作したのだから、
「それ以前の問題」はとくに存在しない。
0927名無しさん@お腹いっぱい。2009/01/21(水) 22:27:22
教えたがりは >>925 自身じゃないのかw

質問されてもいないことを、
別の回答者が回答して解決した後にわざわざ書き込んで話を蒸し返してるし。
09289032009/01/21(水) 22:32:47
>>926

どこが「正常動作」だ?
fd3を開いて閉じる必然性を説明しろ。
09299032009/01/21(水) 22:33:58
>>927

嘘の解決じゃ駄目だろ。
0930名無しさん@お腹いっぱい。2009/01/21(水) 22:39:59
>>928
仕様通りの出力が得られれば正常動作。
スクリプト内部で無駄があったとしても正常動作かどうかの判断には関係ない。
09319032009/01/21(水) 22:44:16
>>930

それは結局「バグ隠し」に繋がる。
コンピュータが期待した動作をするのと、
期待した出力をするのは別物。

バグは潰さないといけない。
0932名無しさん@お腹いっぱい。2009/01/21(水) 22:45:31
>>929
質問者にとって解決ならばそれがすべて。
それを「嘘の解決」と言っているのはお前だけ。
「嘘の解決じゃ駄目だから、真の解決を」なんて言い出すのは、
まさに教えたがりの特徴。
0933名無しさん@お腹いっぱい。2009/01/21(水) 22:46:49
>>931
で、どこにバグがあるの?
09349032009/01/21(水) 22:47:42
まあ勿論、我ら下々の者共よりコンピュータの方が利口なので、
頑張らなくても最適化されている場合が殆どだろうが、
そう言う気概を持ちつづけることは重要。
09359032009/01/21(水) 22:52:44
>>932

掲示板では、発呼した質問者の背後に数多の質問者が居ると言うスタンスが肝要。

>>933

知らん。繋がる考え方と言っているだけで、今バグがあると言っている訳じゃない。
0936名無しさん@お腹いっぱい。2009/01/21(水) 22:58:46
>>935
そんな仮想の質問者まで仮定して、
質問されていないことまで解答にこだわろうとするのは
教えたがりの特徴。
0937名無しさん@お腹いっぱい。2009/01/21(水) 23:51:41
いや教えたがりがいるほうが為になっていいですよ
0938名無しさん@お腹いっぱい。2009/01/21(水) 23:58:52
要件定義や要求仕様より、
スクリプトが正しく動くかのほうが大事。

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

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

>>901 が先に本題の解答をしていなかったら、
>>903 によって、本題以外の突っ込みばかりで
質問者が潰されていたことだろう。
0940名無しさん@お腹いっぱい。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<&- で閉じる。

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

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

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

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

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

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

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

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

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

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

死ねカス。
0949名無しさん@お腹いっぱい。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 を使う。
0950名無しさん@お腹いっぱい。2009/01/23(金) 23:56:03
>>949

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

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

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

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

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

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

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

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

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

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

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

答える必要無し。

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

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

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


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

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

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

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

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

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

出来ていないのはお前。

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

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

妄想は程々に。

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

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

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

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


あと、>>959,960 には、具体的なことが一言も書かれていない。
つまり、全然反論になっていない。
これは、論破された人間が負け惜しみで書く典型的な文章。
0962名無しさん@お腹いっぱい。2009/01/24(土) 13:53:07
もう俺以外は全員勝ちでいいよ
0963名無しさん@お腹いっぱい。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
>>900がIFSを変更したり、ディスクリプタ3番をexecで開いたり閉じたりという
テクニックを知っているにも関わらず、
質問内容自体はごくごく初歩的なのでちょっと驚いた

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

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

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

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

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


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

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

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

なのだから、↑のawkと同等のシェルを作ればいいだけ。
エスケイプなんて余計なことする必要なし。
0976名無しさん@お腹いっぱい。2009/01/26(月) 12:45:13
スクリプトを略すな
0977名無しさん@お腹いっぱい。2009/01/26(月) 13:34:54
>>975
そんなら、とっとと「awkと同等のシェル」作れ。
0978名無しさん@お腹いっぱい。2009/01/26(月) 13:36:50
>>974
Excelで読めないようなCSVはCSVとは認めません。
0979名無しさん@お腹いっぱい。2009/01/26(月) 13:56:43
>>977
>>972
0980名無しさん@お腹いっぱい。2009/01/26(月) 13:58:36
>>976
awkと同等のものがスクリプトなわけないだろ。
シェルでいいんだよ。
レス数が950を超えています。1000を超えると書き込みができなくなります。