我曾经认为 bash 扩展了一些东西,比如"$<var>"
简单地$<var>
用<var>
.然而,在遇到一些例子之后,我意识到我错过了一些东西。考虑以下交互。
1: $ X="A; B"
2: $ printf "%s\n" $X
3: A;
4: B
5: $ printf "%s\n" "A; B"
6: A; B
7: $ printf "%s\n" A; B
8: A
9: B: command not found
正如您所看到的,第 2 行的输出与第 5 行的输出不同,因此在这种情况下$X
扩展不是简单的文本替换。即使删除双引号(第 7 行)也不起作用。
有人能解释一下 bash 到底是如何处理这些情况的吗?
答案1
由于您没有引用$X
它,因此可能会被分词。第 2 行发出的命令是:
printf '%s\n' 'A;' B
请注意,;
shell 会转义 ,但空格不会。这与第 7 行中的命令不同,后者是:
$ printf "%s\n" A; B
由于;
没有转义,它充当命令分隔符,意味着下一个命令是B
,它不是命令,因此您会收到命令未找到错误。
由于双引号,第 5 行可以按预期工作,第 2 行也需要使用双引号。他们将防止分词。你想要的命令是:
printf "%s\n" "$X"