Csh将字符串添加到数组中,空白麻烦

时间:2012-10-31 00:39:17

标签: arrays string shell scripting 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”,下一个条目是“-option1”等。< / p>

使用c shell提前道歉,我公司的代码库仍然存在。

2 个答案:

答案 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

(从Accessing array elements with spaces in TCSH复制)