Bash脚本echo正在执行奇怪的替换

时间:2013-04-25 14:50:54

标签: bash shell glob substitution

实现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上。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

word expansions for a Bourne compatible shell的序列是

  1. Tilde Expansion
  2. 参数扩展
  3. 命令替换
  4. 算术扩展
  5. Field Splitting
  6. 路径名扩展
  7. 报价删除
  8. 因此,在$msg的参数展开后,路径名扩展会找到[query],它会查找名为que,{{1}的文件}或r。你有一个名为y的文件,对吗?

    请注意,此行为取决于y选项的设置。使用f时,不会执行路径名扩展,而set -f则会执行。{/ p>

    当然你也可以双重引用echo arg,因为路径名扩展不会在引用的单词上执行。