在布尔条件中,何时应将变量推入引号中?

在布尔条件中,何时应将变量推入引号中?

以下两个布尔表达式相同吗?

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使用内置命令更为安全。[[

相关内容