- ベストアンサー
csh foreachで「*」でエラーとなる
シェルの初心者です。よろしくお願い致します。 cシェル(csh)で、リストをforeachで1行ずつ取得しているのですが、「*(アスタリスク)」の値があると「一致しません」とエラーで落ちてしまいます。 「*(アスタリスク)」も正常に読んで、ループを回すことはできないのでしょうか? foreach FILE ( \"`/bin/cat リストファイル名`\" ) リストは「|(パイプ)」区切りにしてあります。 foreachで一行ずつ、読んでループしています。 ご存知の方は、お力をお貸し下さい。 よろしくお願い致します。
- みんなの回答 (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行ずつ読んでいる」訳じゃないです。データの途中に空白やタブが無いという前提で同じ動作になりますが。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
foreachのループ内で「取り出してきた値」が、cshでワイルドカード展開される為、*でエラーになります。 取り出してきた値を使用する場合は、cshが余計なワイルドカード展開をしないよう、クォートして下さい。
お礼
回答ありがとうございます。 クォートとは「"」or「'」or「`」のどれでしょうか? ちなみに「"」はダメでした。 一行全体にクォートをかけるのは無理ですか? 値1つ1つにかけないといけないのでしょうか? 初歩的な質問ですみません。 ご回答頂ければと思います。
お礼
回答ありがとうございます。 宿題というのか、うちの会社がそういう風潮になっているもんですから・・・。 set noglob で出来ました。 感謝です。 ありがとうございます。