以下两个布尔表达式相同吗?
if [ -n $1 ] ; then
if [ -n "$1" ] ; then
如果不是--什么时候应该将变量放在引号中?
答案1
这是一个可以展示差异的例子
~$ t="alfa beta"
~$ if [ -n $t ] ; then echo OK ; fi
bash: [: alfa: binary operator expected
~$ if [ -n "$t" ] ; then echo OK ; fi
OK
~$ ls blah*
blah1 blah2 blah3
~$ t="blah*"
~$ if [ -n "$t" ] ; then echo OK ; fi
OK
~$ if [ -n $t ] ; then echo OK ; fi
bash: [: too many arguments
换句话说,如果使用引号,则$t
只会展开一次,并作为 的单个参数放在引号中test
([
只是 的别名test
)。如果不使用引号,则会用 的内容替换它$t
,然后再次扩大。
答案2
在test
条件中(与 相同)[
,您应始终使用双引号,否则test
如果变量为空或未定义,命令可能会丢失参数;如果变量包含空格,命令可能会有太多参数。不过,在 中,对于不需要引号的条件,bash
使用内置命令更为安全。[[