我很难用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中使用空格访问数组元素复制)