unix echo命令的意外行为

时间:2017-03-02 09:16:07

标签: shell unix

在编写脚本时我发现了以下问题,

假设

set x = "param[xyz]";
echo $x

输出是echo:不匹配

但是当我这样做时,

echo "$x"

我得到了输出:param [xyz]

所以echo正在进行双向替换, 最初 echo $ x 已转换为 echo param [xyz] ,然后它尝试查找param [xyz]值。

但理想情况下它应该只是打印变量提供给它。 这种行为是否是有效的用例?

1 个答案:

答案 0 :(得分:1)

echo完全没有替代,它就是执行它的shell。这取决于你使用的shell,但似乎你使用的是c-shell系列的shell。 Shell在命令行中扩展变量,因此第一步是生成:

[csh] echo param[xyz]

然后shell执行文件匹配扩展,但由于没有与该模式对应的文件,shell回答没有匹配。该消息在某种程度上具有误导性,因为shell会提醒您"命令"并不担心命令本身就失败了。

在第二次尝试中,将变量括在"中会阻止shell进行其他扩展,shell会使用第一次扩展后获得的参数启动命令。

如果使用',则存在另一种预防措施,shell不会扩展变量:

[csh] echo '$x'
$x

请参阅shell文档,特别是有关扩展的内容。

说服你的另一个经验是尝试使用不存在的命令:

[csh] weirdo z*
weirdo: No match

与不存在的命令不同:

[csh] weirdo
weirdo: Command not found.

如果您使用其他shell行为会有所不同:

[bash] echo z*
z*

因为shell生成的参数是案例文件匹配中的字符串本身不起作用。

使用:

[zsh] echo z*
zsh: no matches found: z*

行为与c-shell更相似,但消息更清晰,shell在匹配时失败。