• ベストアンサー

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答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

  • cshが詳しい方は教えてください

    cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • LINUXのcshについて、foreach構文の質問です。

    LINUXのcshについて、foreach構文の質問です。 foreach構文で、foreach i (20XX/*.txt)として、カレントディレクトリ上の20XXフォルダに、テキストファイルが数個はいっているとします。 このとき、テキストファイルすべてのはじめから2行をのぞいてそれ以降の部分からmd5sumでハッシュをとり、その横にファイル名をそれぞれつけたいのですが。。。 とりあえず、 foreach i (20XX/*.txt) cat $i | tail -n +2 | md5sum | sort >> 20XX_hash.txt でハッシュ値がとれることは分かったのですが、、、 コレにいかにしてファイル名を付属できますか? 何か良いアイディアありませんか? よろしくお願いします。 申し訳ないですが、明日までにお願いしますOTL

  • CSHの環境変数の設定

    CSHで外部で定義したconfigファイルから変数を読み込み そのシェル及び子シェル内で有効な変数として使用したのですが どのような方法がありますでしょうか? 以下の方法だと親シェルからでは子シェルで設定した変数が読み込めないため困っています。 config.csh #!/bin/csh -f setenv AAA aaa test.csh #!/bin/csh -f set APP_ROOT = `dirname $0` cd $APP_ROOT set CONFIG_FILE=$APP_ROOT"/config.csh" echo $AAA

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • foreachの引数について

    現在、foreachを使ったシェルを作成中なのですが、 そのシェルを実行すると「引数が多すぎます」という エラーが発生します。 処理の概要としては 1.あるフォルダにあるファイルの一覧をリスト   ファイルにはきだす。 2.リストファイルの中身である文字列を含む   場合にのみechoをかける。 です。 リストファイルの中身が1000件を超えると「引数が~」の エラーがでます。 よろしくお願いします。

  • awkからcshへの複数値返却

    スペースデリミタのデータファイルをcsh+awkで解析する機能を作っているのですが、shのreadを使った場合のように、複数の値をshell側に返す方法がわかりません。 例)shの場合(本当はva1,val2は1つの変数に設定したいので、あくまで例) ------------------------------------- % less list KIND1 YES NO KIND2 NO YES % less echo_hoge.sh #!/bin/sh while read val1 val2; do ←★このval1 val2に設定する手段がcshで見つからない echo $val1 $val2; done < list ------------------------------------- cshでスペースデリミタでかつ使用不可文字なしのデータファイルを行単位に処理するのは難しいと考え、awkを使って処理しようと考えたのですが、awkだと1つの処理結果しかshell変数に設定できない(ように思える)ため、困っています。 例)csh+awk ------------------------------------------------ set kind1 = `cat list | awk '{ if ( $1 == "KIND1" print $2 $3)}'` set kind2 = `cat list | awk '{ if ( $1 == "KIND2" print $2 $3)}'` ------------------------------------------------ 上記のように2回読まずにうまくshell変数に設定する方法がないか教えてください(sh使用は政治上の理由でNGです)。 よろしくお願いします。

  • UNIXのcshについて。

    ちょっとここに質問していいものか迷いましたが、 このカテゴリで質問させていただきます。 UNIXのCシェルで、あるシェル変数に1行分のデータが 読み込まれていて、これをいくつかのデータがタブ 区切りで入っています。 これを違う複数の変数に各データを切り分けて入れた いのですが、どうしたらいいかわかりません。 awkやsedという手を考えたのですが、あれはファイルから 読み込むので、できませんでした。 わかる方がいらっしゃればよろしくお願いします。

  • シェルファイル内での「setenv」、「unsetenv」の実行 その2

    シェルファイルの先頭行に、 「#!/bin/csh」 と記述したところ「system: Undefined variable.」というメッセージが出力されてしまいました・・・。 どうしたらよいのでしょう?設定の問題なのでしょうか? よくわからないのですが、 「env | grep csh」 と実行してみると「SHELL=/user/bin/csh」という結果がえられるのですが・・・。

  • Cygwin上でCシェルのforeachが動かない……

    今回UNIX上の機能をWindows上で実現できる 「Cygwin」というものをインストールしました。 あるプログラムa.outを同じディレクトリにあるxmlファイル全てに対して実行したかったので #!/bin/csh foreach i(*.xml) ./a.out $i end というk.shファイルを作り csh k.sh で実行してみたのですが最初に見つかったと思われる一つのxmlファイルにしかa.outが実行されません。 スクリプトの書き方に問題があるのでしょうか? それともプログラム……? ここを利用するのは初めてですが、どうぞよろしくお願いします。

  • 【csh】ファイルの中の値を配列変数として取得するには?

    環境はHP-UX11です。 ファイルを読み込ませて、そのファイルの中身の一行を配列のひとつとして変数に代入するにはどうしたらよいのでしょうか? 例えばファイルの中身が $DIR1/$FILE1 $DIR1/$FILE2 $DIR2/$FILE3 だったとして、この3行を配列として読み込ませたいのですが、cshで可能なんでしょうか? よろしくお願いします。

専門家に質問してみよう