Bash脚本echo正在执行一个奇怪的替换
意识到bash对双引号、单引号、方括号等非常挑剔——我今天遇到了一个奇怪的行为,无法解释它。这个问题本身很容易避免,但我不明白原因。我很想了解为什么发生这种情况只是为了提高我的bash知识 下面是一个简短的示例--test.sh文件的内容:Bash脚本echo正在执行一个奇怪的替换,bash,shell,glob,substitution,Bash,Shell,Glob,Substitution,意识到bash对双引号、单引号、方括号等非常挑剔——我今天遇到了一个奇怪的行为,无法解释它。这个问题本身很容易避免,但我不明白原因。我很想了解为什么发生这种情况只是为了提高我的bash知识 下面是一个简短的示例--test.sh文件的内容: msg="Usage: command password [dbhost] [database] [user] [query] [filetag]" echo $msg 然后运行: sh test.sh 我预计产出将是: Usage: command p
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”改为“queryx”,那么输出的那部分将变成“x”
如果我将单词“query”改为“xuery”,那么输出的那部分将变成“xy”
如果我将单词“query”改为“xuerx”,那么输出的那部分将变成“x”
没有名称为query、querx等的本地或环境变量
这是红帽上的。有什么想法吗?顺序是
$msg
进行参数扩展之后,路径名扩展将找到[query]
,该文件将查找名为q
、u
、e
、r
或y
的文件。您有一个名为y
的文件,对吗
请注意,此行为取决于f
选项的设置。使用set-f
不执行路径名扩展,而使用set+f
则执行路径名扩展
当然,您也可以双引号引用echo arg,因为路径名扩展不会对引号中的字执行。永远不要使用非引号中的变量(除非您是bash大师,可以杀死所有进程并用3个特殊字符(不含字母)重新格式化根文件系统)。将此更改为
echo“$msg”
。我认为它正在尝试匹配目录中的文件。是否有名为“x”或“y”的文件或目录?失败的直接原因是当前目录中有某些文件的名称只有一个字母。和[word]
匹配其中一个或多个。不要相信我,转到一个空目录并重试,然后添加一个字母的文件,看看有什么变化。你是正确的,我测试的目录中有名为“x”和“y”的文件。构造“[query]”的什么原因会导致这些文件名以这种方式匹配/扩展?[abc]
是匹配a
或b
或c
的glob。它的定义是这样的。当然,您可以将此构造与其他glob(如*
和?
以及plin字符)组合,以获得更有用的模式。