如何避免引用参数中的意外换行符

How to avoid unexpected newlines in quoted arguments

也许有人可以向我解释在使用 bash 和多词参数时出现以下意外结果?当我传递这样一个不带引号的 echo 参数时,我得到:

> for i in *.jpg; do tmp=`basename -s .jpg $i`; echo $tmp; done       
25 Chaos auf Schloss Burgeck
26 Die kaiserliche Urkunde
[...]

但是当我添加引号时,我得到以下结果:

> for i in *.jpg; do tmp=`basename -s .jpg $i`; echo "$tmp"; done     
25
Chaos
auf
Schloss
Burgeck
26
Die
kaiserliche
Urkunde
[...]

这是怎么回事?两个输出都无法用于进一步处理,例如 mdkir.

经验法则:总是引用变量,除非你知道自己在做什么。

在你的第二个命令中你只引用了一个变量。 $i 仍未被引用,因此受到 bash 的分词。因此,在第一次迭代中,basename 命令没有收到一个参数 25 Chaos auf Schloss Burgeck.jpg,而是收到五个参数 25ChaosaufSchloss , 和 Burgeck.jpg。对于每个参数 basename 打印一行。

在您的命令的完全不加引号的变体中,这没有问题,因为换行符在 $tmp 的分词过程中被 bash 删除。 echo 然后插入空格使得(偶然)最终结果再次正确。 Hoewever,如果您的文件名包含多个后续空格或特殊符号,如 * 结果也会在未引用的变体中关闭。

脚本的更正版本:

for i in *.jpg; do tmp=$(basename -s .jpg "$i"); echo "$tmp"; done

相当于

for i in *.jpg; do echo "${i%.jpg}"; done