在使用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
。
答案 0 :(得分:2)
经验法则:总是引用变量,除非您知道自己在做什么。
在第二个命令中,您仅引用了一个变量。 $i
仍未引用,因此受到bash单词拆分的影响。因此,在第一次迭代中,basename
命令没有接收到一个参数25 Chaos auf Schloss Burgeck.jpg
,而是接收了五个参数25
,Chaos
,auf
,Schloss
和Burgeck.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