2017-01-02 86 views
3
#!/bin/csh -f 

foreach line ("`cat test`") 
    set x=`echo "$line" | awk '{split($0, b, " "); print b[1]}'` 
    echo "$x" 
end 

測試文件包含以下內容:爲什麼我的csh腳本不能使用特殊字符?

 
How to Format 
Stack[7] Overflow 
Put returns between paragraphs 

在執行腳本我收到以下錯誤:

 
set: No match. 

如何存儲包含了像在方括號[]特殊字符的字符串變量,然後在代碼中使用它們?

回答

3

的問題是,你正在做的:

set x = [some string with shell globbing characters] 

這不會出於同樣的原因的工作,set x = foo作品,但set x = [foo]沒有。您需要使用set x = "[foo]"(或'[foo]')來轉義特殊的shell匹配字符(在這種情況下爲[])。

在C shell中嵌套報價相當困難,這也是it's generally discouraged to use the C shell for scripting的原因之一。對你的命令來說也許是可能的,但我不夠聰明(或者太懶惰)來弄明白。我的解決方案通常是在設置專用noglob變量來防止的通配符的擴充:

set noglob 
foreach line ("`cat test`") 
    set x = `echo "$line" | awk '{split($0, b, " "); print b[1]}'` 
    echo "$x" 
end 

輸出:

How 
Stack[7] 
Put 

P.S.有一種更簡單的方法來回顯每一行的第一個單詞;把它列入清單:

set noglob 
foreach line ("`cat test`") 
    set x = ($line) 
    echo "$x[1]" 
end 
+0

謝謝。兩種解決方案都適用於我。 –

相關問題