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 

然而,问题是数组条目不是完整的字符串,而是字符串的每个部分都被空格分开,即第一个条目仅是" $ expassionioncmd",下一个条目将是" -option1"等。<<<<

事先为使用C外壳提供了道歉,我公司的代码库被卡住了。

每当您扩展整个数组并希望保持其单个元素的身份完整时,您就需要: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

马克的解决方案对于大多数应用程序显然是优越的,但是还有另一种选择。而不是直接使用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

(通过在TCSH中使用空格访问数组元素复制)

最新更新