Bash:为什么echo会增加额外的空间?

Dan*_*Dan 9 syntax bash echo

我明白了:

$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
 Db.jpg
 Dc.jpg
Run Code Online (Sandbox Code Playgroud)

注意:输出的第2行和第3行上的Db和Dc之前的额外空格.

这些为什么?

谢谢,丹

编辑:因为我的实际目标中有空格(我本应该写的):

echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"
Run Code Online (Sandbox Code Playgroud)

这里的大多数解决方案对我都不起作用(for loop,xarg,tr).Printf没有工作,因为我想要cantesian产品的多个括号扩展.

我结合了3个解决方案(mletterle的\ b,Dennis Williamson的额外空间,以及Jim Dennis的使用少得多的报价)来得到:

echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
Run Code Online (Sandbox Code Playgroud)

谢谢所有回答的人!我从你的回答中学到了很多东西!

Jam*_*ley 10

因为这就是大括号扩展的作用.从man bash标题下方Brace expansion:

要扩展的模式采用可选前导码的形式,后跟...一系列以逗号分隔的字符串......后跟可选的postscript.前导码以大括号中包含的每个字符串为前缀,然后将postscript附加到每个结果字符串,从左向右扩展例如,{d,c,b} e扩展为"ade ace abe"

所以在你的例子中,"D"是序言,".jpg \n"是后记.

因此,在支撑扩展发生后,您将离开:

echo -e Da.jpg\n Db.jpg\n Dc.jpg\n

正如赫威尔指出的那样,贝壳然后将它分成三个标记并将它们传递给回声; 输出由空格分隔的每个标记.要获得所需的输出,您需要使用此处的许多建议之一,这些建议不会在标记之间重新插入不需要的空间.

它更长,可能不是最好的方法,但是下面给出了你想要的输出:

for file in "D"{a,b,c}".jpg"
do
  echo ${file}
done
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 10

使用更便携的printf

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

echo总是在参数之间添加空格。试试你的命令\n并比较结果。

  • 添加空格不是“echo”。在命令行尝试只使用 `"D"{a,b,c}".jpg"` - 你会得到 `bash: Da.jpg: command not found`。它是大括号扩展添加了空格。 (3认同)
  • *shell* 在将参数列表传递给命令之前删除参数之间的空格,并且 echo 在参数之间添加 *一个空格*(无论 echo 是 shell 内置命令还是外部命令)。这就是 echo 添加一个“额外”空间的原因,这就是问题所问的。 (2认同)

mle*_*rle 3

最简单、最干净的解决方案是在每行前面添加一个退格键:

echo -e -n "\bD"{a,b,c}".jpg\n"
Run Code Online (Sandbox Code Playgroud)

这会产生所需的输出。