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

JDS*_*JDS 6 arrays string shell scripting csh

我在使用csh做一些基本的事情时遇到了麻烦.我有一个字符串:

set newCmd = "$expansionCmd –option1 –option2 …"
Run Code Online (Sandbox Code Playgroud)

我正在创建这些字符串的数组,我后来想要执行它们:

set expansionCmdList = ($expansionCmdList[*] "$newCmd")   
#I also tried without quotes, e.g. just $newCmd
Run Code Online (Sandbox Code Playgroud)

最后,我尝试迭代并执行这些命令:

foreach exCmd ($expansionCmdList) 
    `exCmd`    #execute it in the shell
end 
Run Code Online (Sandbox Code Playgroud)

但是问题是数组条目不是完整的字符串,而是用空格分隔的字符串的每个部分,即第一个条目只是"$ expansionCmd",下一个条目是"-option1"等.

提前使用c shell道歉,我公司的代码库坚持使用它.

Mar*_*eed 9

无论何时扩展整个数组并希望保持其各个元素的完整性,都需要:q在扩展上使用修饰符.否则,只要你执行类似的set expansionCmdList=($expansionCmdList[*] "$newCmd")操作,列表中的所有先前命令就会被拆分为它们的组件字,每个组件字现在都是它自己的数组元素.简单演示:

% set a = ( a "b c" d )
% echo $a[2]
b c
% set a = ( $a[*] e )
% echo $a[2]
b
Run Code Online (Sandbox Code Playgroud)

哎呀,你甚至在进入执行循环之前搞砸了数组.事情变得更好:q:

% set a = ( a "b c" d )
% set a = ( $a:q e )
% echo $a[2]
b c
Run Code Online (Sandbox Code Playgroud)

您需要在for循环中使用相同的修饰符:

foreach exCmd ($expansionCmdList:q) 
Run Code Online (Sandbox Code Playgroud)

最后,` `exCmd``尝试运行一个名为"exCmd"的命令.你想要做的是运行变量的值.你可能会遇到更多的空白问题,你不能通过使每个命令成为一个数组来解决它们,因为csh不支持数组数组.公平的警告.但如果命令没有任何报价需求,这将有效:

  $exCmd
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我发誓我只能在c shell上找到唯一的文档,有人说不要使用c shell。 (2认同)