为什么我的 csh 脚本不能处理特殊字符?

Why is my csh script not working with special characters?

#!/bin/csh -f

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

测试文件包含以下内容:

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

在执行脚本时出现以下错误:

set: No match.

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

问题是你在做:

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([=11=], 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