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 shell 道歉,我公司的代码库被它卡住了。

4

2 回答 2

10

每当您扩展整个数组并希望保持其各个元素的身份不变时,您需要:q在扩展上使用 (for "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

Mark 的解决方案对于大多数应用程序来说显然是优越的,但还有另一种选择。不是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 space in TCSH

于 2014-12-04T20:05:58.863 回答