Bash 如何避免引用参数中出现意外的换行符
也许有人可以向我解释在使用bash和多单词参数时出现的以下意外结果?当我传递这样一个不带引号的Bash 如何避免引用参数中出现意外的换行符,bash,variables,spaces,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=`basena
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
打印一行
在命令的完全不带引号的变体中,这没有问题,因为bash在$tmp
的分词过程中删除了新行echo
然后插入空格,这样(碰巧)最终结果再次正确。但是,如果文件名包含多个后续空格或特殊符号,如*
,则在未加引号的变量中,结果也会被关闭
脚本的更正版本:
for i in *.jpg; do tmp=$(basename -s .jpg "$i"); echo "$tmp"; done
这相当于
for i in *.jpg; do echo "${i%.jpg}"; done
经验法则:除非你知道自己在做什么,否则总是引用你的变量
在第二个命令中,您只引用了一个变量$i
仍然没有被引用,因此受到bash的分词限制。因此,在第一次迭代中,basename
命令没有收到一个参数25 Chaos auf Schloss Burgeck.jpg
,而是收到五个参数25
、Chaos
、auf
、Schloss
和Burgeck.jpg
。对于每个参数,basename
打印一行
在命令的完全不带引号的变体中,这没有问题,因为bash在$tmp
的分词过程中删除了新行echo
然后插入空格,这样(碰巧)最终结果再次正确。但是,如果文件名包含多个后续空格或特殊符号,如*
,则在未加引号的变量中,结果也会被关闭
脚本的更正版本:
for i in *.jpg; do tmp=$(basename -s .jpg "$i"); echo "$tmp"; done
这相当于
for i in *.jpg; do echo "${i%.jpg}"; done
如果文件名中有空格,则正确的工具是“查找”,而不是“全局搜索”。您看到不同输出的原因是,使用引号时,特殊字符(如\n\t等)受到尊重。@MatiasBarrios我不同意。处理带有空格的路径,尤其是由
find
返回的换行符,比使用globbing困难得多<“代码>查找”的速度也较慢。如果文件名中有空格,则正确的工具是“查找”,而不是“全局搜索”。您看到不同输出的原因是,使用引号时,特殊字符(如\n\t等)得到了尊重。@MatiasBarrios我不同意。处理带有空格的路径,尤其是由find
返回的换行符,比使用globbing困难得多<代码>查找也比较慢。