6

csh で基本的なことを行うのに問題があります。私は文字列を持っています:

set newCmd = "$expansionCmd –option1 –option2 …"

そして、後で実行したいこれらの文字列の配列を作成しています。

set expansionCmdList = ($expansionCmdList[*] "$newCmd")   
#I also tried without quotes, e.g. just $newCmd

最後に、これらのコマンドを繰り返し実行してみます。

foreach exCmd ($expansionCmdList) 
    `exCmd`    #execute it in the shell
end 

しかし問題は、配列エントリが完全な文字列ではなく、文字列のすべての部分が空白で区切られていることです。つまり、最初のエントリは単に「$expansionCmd」であり、次のエントリは「—option1」などになります。

C シェルを使用していることをあらかじめお詫び申し上げます。私の会社のコード ベースは C シェルに固執しています。

4

2 に答える 2

10

配列全体を展開していて、個々の要素の ID をそのまま維持したい場合はいつでも、展開時に:q("quoted" の) 修飾子が必要です。それ以外の場合は、 のような操作を行うとすぐset expansionCmdList=($expansionCmdList[*] "$newCmd")に、リスト内の以前のすべてのコマンドがコンポーネント ワードに分割され、それぞれが独自の配列要素になります。簡単なデモンストレーション:

% set a = ( a "b c" d )
% echo $a[2]
b c
% set a = ( $a[*] e )
% echo $a[2]
b

おっと、実行ループに到達する前に配列を台無しにしてしまいました。物事はより良くなり:qます:

% set a = ( a "b c" d )
% set a = ( $a:q e )
% echo $a[2]
b c

for ループで同じ修飾子を使用する必要があります。

foreach exCmd ($expansionCmdList:q) 

最後に、`exCmd`文字通り「exCmd」という名前のコマンドを実行し、その出力をコマンドとして実行しようとします。おそらくやりたいことは、変数の値に等しいコマンドを実行することです。csh は配列の配列をサポートしていないため、各コマンドを配列にすることによってそれらを解決することはできません。公正警告。ただし、コマンドに引用符が必要ない場合、これは機能します。

  $exCmd
于 2012-10-31T01:10:51.350 に答える
1

マークのソリューションはほとんどのアプリケーションで明らかに優れていますが、別のオプションがあります。直接使用する代わりにforeach、配列のサイズを取得し、シーケンスを反復処理します。

set BUILD_MATRIX = ( "makefile.make:make --jobs --makefile=makefile.make" \
                     "Makefile:make --jobs --makefile=Makefile" \
                     "build.xml:ant" )

foreach i ( `seq ${#BUILD_MATRIX}` )
  echo $i
  echo $BUILD_MATRIX[$i]
end

( TCSH でスペースを使用して配列要素にアクセスするからコピー)

于 2014-12-04T20:05:58.863 に答える