双引号的重要性

假设在一份 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原文地址:https://segmentfault.com/a/1190000039424194

%s 个评论

要回复文章请先登录注册