假设在一份 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 变量无法展开。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。