3

意识到 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]

如果我将单词“query”更改为“querx”,则输出的那部分变为“x”。

如果我将“查询”一词更改为“xuery”,则输出的那部分将变为“x y”。

如果我把“query”这个词改成“xuerx”,那部分输出就变成了“x x”。

没有名称为 query、querx 等的本地或环境变量。

这是在 RedHat 上。有任何想法吗?

4

1 回答 1

4

Bourne 兼容 shell的单词扩展序列是

  1. 波浪号扩展
  2. 参数扩展
  3. 命令替换
  4. 算术展开
  5. 字段拆分
  6. 路径名扩展
  7. 报价删除

因此,在参数扩展之后$msg,路径名扩展[query]会查找查找名为que或的r文件y。你有一个名为 的文件y,对吧?

请注意,此行为取决于f选项的设置。withset -f不执行路径名扩展,而 with set +fit 是。

当然,您也可以双引号 echo arg,因为路径名扩展不会对引用的单词执行。

于 2013-04-25T15:07:41.227 回答