• ベストアンサー

csh foreachで「*」でエラーとなる

シェルの初心者です。よろしくお願い致します。 cシェル(csh)で、リストをforeachで1行ずつ取得しているのですが、「*(アスタリスク)」の値があると「一致しません」とエラーで落ちてしまいます。 「*(アスタリスク)」も正常に読んで、ループを回すことはできないのでしょうか? foreach FILE ( \"`/bin/cat リストファイル名`\" ) リストは「|(パイプ)」区切りにしてあります。 foreachで一行ずつ、読んでループしています。 ご存知の方は、お力をお貸し下さい。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.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行ずつ読んでいる」訳じゃないです。データの途中に空白やタブが無いという前提で同じ動作になりますが。

Mark0817
質問者

お礼

回答ありがとうございます。 宿題というのか、うちの会社がそういう風潮になっているもんですから・・・。 set noglob で出来ました。 感謝です。 ありがとうございます。

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

foreachのループ内で「取り出してきた値」が、cshでワイルドカード展開される為、*でエラーになります。 取り出してきた値を使用する場合は、cshが余計なワイルドカード展開をしないよう、クォートして下さい。

Mark0817
質問者

お礼

回答ありがとうございます。 クォートとは「"」or「'」or「`」のどれでしょうか? ちなみに「"」はダメでした。 一行全体にクォートをかけるのは無理ですか? 値1つ1つにかけないといけないのでしょうか? 初歩的な質問ですみません。 ご回答頂ければと思います。

関連するQ&A

専門家に質問してみよう