假设在一份 Bash 脚本里,函数 foo 的定义如下:

function foo {
    echo ">> $1 ..."
    echo ">> $2 ..."
}

调用 foo:

foo "" "test"

亦即,以空字串和 "test" 为参数值调用 foo,结果为

>>>  ...
>>> test ...

现在假设有函数 bar,其定义如下

function bar {
    foo $1 $2
}

然后调用 bar

bar "" "test"

结果输出

>>> test ...
>>>  ...

原因是,bar 接受的第一个参数值是空字串,但是当它将这个参数值传递给 foo 时,Bash 不再认为这个参数值是空字串了,而是将其视为 $IFS——域分隔符,因此 foobar 这里只得到了一个参数值 "test" 并将其视为它的第一个参数值。

事实上,不仅空字串经常容易惹祸,参数值里若有空格,也会令 bar 的行为难以预料。

bar 的正确定义如下:

function bar {
    foo "$1" "$2"
}

所以,在编写 Bash 脚本时,若不确定函数的参数值里是否为空字串或含有空格,就不应该犹豫,以双引号围之。单引号不可,因为单引号里,Bash 变量无法展开。


garfileo
6k 声望1.9k 粉丝

这里可能不会再更新了。