实现bash对双引号,单引号,括号等非常挑剔 - 我今天遇到了一个奇怪的行为,无法解释它。问题本身很容易避免,但我不明白原因。我很想知道为什么这只是为了提高我的bash知识。
这是一个缩短的例子 - 文件test.sh的内容:
msg="Usage: command password [dbhost] [database] [user] [query] [filetag]"
echo $msg
然后运行:
sh test.sh
我预计输出会是:
Usage: command password [dbhost] [database] [user] [query] [filetag]
但我得到的是:
Usage: command password [dbhost] [database] [user] y [filetag]
如果我将“查询”改为“querx”,则输出的那部分变为“x”。
如果我将“查询”改为“xuery”,则输出的那部分变为“x y”。
如果我将“查询”改为“xuerx”,则输出的那部分变为“x x”。
没有名称如query,querx等的本地或环境变量。
这是在RedHat上。有什么想法吗?
答案 0 :(得分:4)
word expansions for a Bourne compatible shell的序列是
因此,在$msg
的参数展开后,路径名扩展会找到[query]
,它会查找名为q
,u
,e
,{{1}的文件}或r
。你有一个名为y
的文件,对吗?
请注意,此行为取决于y
选项的设置。使用f
时,不会执行路径名扩展,而set -f
则会执行。{/ p>
当然你也可以双重引用echo arg,因为路径名扩展不会在引用的单词上执行。