为什么我的脚本在控制台输出中省略前导空格?


10

我有以下脚本:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

运行它时,得到以下输出:

$ ./test.sh
indented by 4 spaces

我的四个地方去了哪里?我该如何找回他们?

Answers:


22

只需echo在函数中引用:

function consoleWriteLine() {
  echo "$*" >&2
}

echo只是注意到通过空间和打印他们分开被分隔的多个参数的单一空间。看到:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

在最后一个示例中,字符串a b c一个单个参数,并且echo按原样进行编辑。


我在这里要理解的关键是,最初引用该参数只会保留空白,直到将其传递给为止consoleWriteLine。第二次echo输入空格时,需要再次用空格将引号引起来。我从没想过你可以把引号括起来$*
Der Hochstapler,2015年

4
您不仅可以在引号周围加上引号$*,而且$@还专门创建了该变体以在引号时扩展成单独的单词"$@"可以是多个参数,"$*"总是一个。echo是少数没有区别的命令之一。
亚历克西斯2015年

4

我自己遇到了这个问题,

按照此博客,您需要更改IFS,因为默认情况下它包含空格,因此将“ xxx yyy zzzz”视为3个字符串,它们之间有空格。

IFS='\n'

该命令之前的命令将对其进行修复,并取消设置IFS以删除更改

unset IFS


2
这是可行的,但是可接受的解决方案(添加引号)要整洁得多。
caesarsol 2015年

点头,我没注意到它没有被引用。哎呀!:D
djsmiley2kStaysInside
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.