我在使用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”等。< / p>
使用c shell提前道歉,我公司的代码库仍然存在。
答案 0 :(得分:8)
每当您扩展整个数组并希望保持其各个元素的身份完整时,您需要在扩展上使用: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 :(得分:0)
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