如何避免引号中出现意外的换行符

时间:2019-12-19 13:37:59

标签: bash variables spaces

在使用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

1 个答案:

答案 0 :(得分:2)

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

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

在命令的完全未引用的变体中,这没问题,因为在$tmp的单词拆分过程中,换行符被bash删除。 echo然后插入空格,以便(偶然)最终结果再次正确。但是,如果您的文件名包含多个后续空格或特殊符号(例如*),则结果也将在未加引号的变体中出现。

脚本的正确版本:

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

等同于

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