foreach は変数に格納された一致条件を繰り返します。

foreach は変数に格納された一致条件を繰り返します。

foreach を使用して a_condition* と一致するサブフォルダー名を検索すると、次のように正常に機能します。

foreach i (a_condition*)
    echo $i
end

a_condition1 a_condition2...を印刷します。

しかし、a_conditon*をハードコーディングせずに試してみると、次のようになります。

set condition = a_condition*
foreach i ($condition)
   echo $i
end

最初の値のみを印刷します。なぜこれが起こるのですか?

答え1

csh私が知っているすべての実装/バージョンで:

set condition = a_condition*

同じです:

set condition = (a_condition*)

つまり、glob拡張によるすべてのファイル名を含む配列を作成しますa_condition*。 PDP11エミュレータの2BSDで元々1979年の実装を確認しましたが、csh結果は同じでした。

あなたが説明する動作は、行が次のように解釈されるように見えます。

set condition = a_condition1 a_condition2 a_condition3...

つまり、condition値を持つ変数とa_condition1名前付き変数をa_condition2定義しますa_condition3。同様の動作を持つ実装は認識されず、元の実装のcshようにそのような実装が存在する可能性はほとんどありません。いいえ、そうであれば試してみてください。これ:

set condition = (a_condition*)

これが変化をもたらすことを確認してください。これもより自己説明的です。

とにかく、割り当て時にグローブを拡張し、ループが要素を繰り返すようにするには、構文は次のとおりです。

set condition = (a_condition*)
foreach i ($condition:q)
  echo $i:q
end

condition含めたい場合a_condition* ひもそして、文字列は反復中にglobに展開されます。つまり:

set condition = 'a_condition*'
foreach i ($condition)
  echo $i:q
end

関連情報