Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何避免引用参数中出现意外的换行符_Bash_Variables_Spaces - Fatal编程技术网

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

也许有人可以向我解释在使用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
打印一行

在命令的完全不带引号的变体中,这没有问题,因为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困难得多<代码>查找也比较慢。