2012-10-31 96 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複製)