bash 参数扩展似乎不是简单的文本替换

bash 参数扩展似乎不是简单的文本替换

我曾经认为 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"

相关内容