在 bash 中回显一个带有括号的字符串会返回“b”

在 bash 中回显一个带有括号的字符串会返回“b”
$ a='"apple","ball","cat"'
$ a='['$a
$ echo $a
["apple","ball","cat"
$ a=$a']'
$ echo $a
b

b当我期待看到结果时,我被结果难住了["apple,"ball","cat"]。我在这里缺少什么?

这是来自bashMac 上的 shell。还可以在 CentOS 7 上看到它,但在 Fedora 上看不到。有人可以解释一下吗?

答案1

b当前目录中有一个同名的文件。

[...]

是一个模式匹配表达式。它匹配名称由[和之间的单个字母组成的每个文件]

这类似于*在变量值中使用不带引号的变量。

答案2

豪克已经回答了为什么会发生这种情况。为了将来参考,您还可以通过以下方式排查发生的情况strace

$ touch a b l
$ a='["apple","ball"]'                                                      
$ strace -e trace=execve echo $a
execve("/bin/echo", ["echo", "a", "b", "l"], [/* 82 vars */]) = 0
a b l
+++ exited with 0 +++

或者与set -x

$ set -x; echo $a
+ set -x
+ echo a b l
a b l

可能不会立即清楚,但至少您看到 shell 已将不带引号的变量转换为项目列表;从那里我们可以推断发生了文件名扩展。

相关内容