为什么我的csh脚本不能使用特殊字符?

时间:2017-01-02 09:45:27

标签: shell csh

#!/bin/csh -f

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

测试文件包含以下内容:

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

在执行脚本时,我收到以下错误:

set: No match.

如何在变量中存储包含方括号[]等特殊字符的字符串,然后在代码中使用它们?

1 个答案:

答案 0 :(得分: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