双引号的重要性
假设在一份 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——域分隔符,因此 foo 从 bar 这里只得到了一个参数值 "test" 并将其视为它的第一个参数值。
事实上,不仅空字串经常容易惹祸,参数值里若有空格,也会令 bar 的行为难以预料。
bar 的正确定义如下:
function bar {
foo "$1" "$2"
}所以,在编写 Bash 脚本时,若不确定函数的参数值里是否为空字串或含有空格,就不应该犹豫,以双引号围之。单引号不可,因为单引号里,Bash 变量无法展开。