$ a='"apple","ball","cat"'
$ a='['$a
$ echo $a
["apple","ball","cat"
$ a=$a']'
$ echo $a
b
b
当我期待看到结果时,我被结果难住了["apple,"ball","cat"]
。我在这里缺少什么?
这是来自bash
Mac 上的 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 已将不带引号的变量转换为项目列表;从那里我们可以推断发生了文件名扩展。