如何避免引用参数中的意外换行符
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
,而是收到五个参数 25
、Chaos
、auf
、Schloss
, 和 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
也许有人可以向我解释在使用 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
,而是收到五个参数 25
、Chaos
、auf
、Schloss
, 和 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