gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:26:30 25 4
gpt4 key购买 nike

意识到 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”。

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

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

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

这是在 RedHat 上。有什么想法吗?

最佳答案

word expansions for a Bourne compatible shell的序列是

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

因此在对$msg 进行参数扩展后,路径名扩展会找到[query],它会查找名为q 的文件, uery。您有一个名为 y 的文件,对吧?

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

当然,您也可以双引号回显参数,因为不会对引用的词执行路径名扩展。

关于Bash 脚本 echo 正在执行一个奇怪的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16218022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com