2012-10-31 47 views
5

cshで何か基本的なことをするのに問題があります。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"であることです。次のエントリはb e "-options1"など。

私の会社のコードベースは、あらかじめCシェルを使用してお詫びしています。

答えて

7

アレイ全体を展開していて、個々の要素のIDをそのまま保持したい場合は、展開時に:q修飾子が必要です。それ以外の場合は、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 
+1

感謝の男...私はCシェル上で見つけることができる唯一のドキュメントがある誓います人々はCシェルを使用しないと言っています。 – JDS

+1

さて、cshをスクリプティングに使用しない唯一の重要な理由は、cshは非常に優れたスクリプト言語ではないということです。何らかのサブプログラム機能を持たせるためにエイリアスをノットに変えなければならないという事実のためです。しかし、それがあなたが持っているものなら、それはあなたが持っているものです。そして、POSIXシェルの前に配列と組み込み算術がずっと前にありました。 :) –

+0

'$ {array}:q 'を使うことはできません。' $ arr:q'でなければなりません。もちろん@SeanAllred –

0

マークのソリューションは、ほとんどのアプリケーションのために明らかに優れているが、別のオプションがあります:コマンドは任意の引用のニーズを持っていない場合でも、これは動作します。代わりに、直接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 

Accessing array elements with spaces in TCSHからコピー)

関連する問題