プロが教える店舗&オフィスのセキュリティ対策術

シェルの初心者です。よろしくお願い致します。

cシェル(csh)で、リストをforeachで1行ずつ取得しているのですが、「*(アスタリスク)」の値があると「一致しません」とエラーで落ちてしまいます。
「*(アスタリスク)」も正常に読んで、ループを回すことはできないのでしょうか?

foreach FILE ( \"`/bin/cat リストファイル名`\" )

リストは「|(パイプ)」区切りにしてあります。
foreachで一行ずつ、読んでループしています。

ご存知の方は、お力をお貸し下さい。
よろしくお願い致します。

A 回答 (2件)

csh縛りというのは宿題か何かですか?そうじゃないなら、cshは機能が貧弱なのでプログラム的な処理には向きません。

shを使いましょう。

#!/bin/sh
while read FILE
do ....
done < リストファイル名

>リストは「|(パイプ)」区切りにしてあります。
例えば、リストファイルの中身が、
A|B|100
X|Y|123
の様になっているとすると、

#!/bin/sh
IFS="|"
while read F1 F2 F3
do ....
done < リストファイル名

で、各フィールドを別々に取り出せます。

どうしてもcshでしないといけない理由があるなら、set noglobで*や?のファイルマッチを無効にすればエラーは出ません。
#!/bin/csh
set noglob
foreach FILE (`cat リストファイル名`)
echo "$FILE"
end
ただ、おわかりかと思いますが、これは「1行ずつ読んでいる」訳じゃないです。データの途中に空白やタブが無いという前提で同じ動作になりますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

宿題というのか、うちの会社がそういう風潮になっているもんですから・・・。

set noglob
で出来ました。
感謝です。
ありがとうございます。

お礼日時:2008/11/13 14:18

foreachのループ内で「取り出してきた値」が、cshでワイルドカード展開される為、*でエラーになります。



取り出してきた値を使用する場合は、cshが余計なワイルドカード展開をしないよう、クォートして下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

クォートとは「"」or「'」or「`」のどれでしょうか?

ちなみに「"」はダメでした。

一行全体にクォートをかけるのは無理ですか?
値1つ1つにかけないといけないのでしょうか?

初歩的な質問ですみません。
ご回答頂ければと思います。

お礼日時:2008/11/12 16:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!