在编写脚本时我发现了以下问题,
假设
set x = "param[xyz]";
echo $x
输出是echo:不匹配
但是当我这样做时,
echo "$x"
我得到了输出:param [xyz]
所以echo正在进行双向替换, 最初 echo $ x 已转换为 echo param [xyz] ,然后它尝试查找param [xyz]值。
但理想情况下它应该只是打印变量提供给它。 这种行为是否是有效的用例?
答案 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在匹配时失败。