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

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

意识到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”改为“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字符)组合,以获得更有用的模式。