2012-10-31 98 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“-option1”等。

对于使用c shell而言,我的公司的代码库已经提前道歉了。

回答

7

任何时候当您展开整个阵列并希望保持其各个元素的标识完整时,您需要在扩展上使用: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 shell中唯一的文档人们说不要使用c shell。 – JDS

+1

那么,不使用csh编写脚本的唯一重要原因就是csh不是一个非常好的脚本语言......由于事实上你必须将别名扭曲成节以便具有任何类型的子程序能力。但是,如果这就是你所拥有的,那就是你的。在POSIX shell之前,它确实拥有数组和内置算术。 :) –

+0

请注意,使用'$ {array}:q'将不起作用 - 它必须是'$ arr:q'。 –

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复制)