如何确定bash变量是否为空?

分享于 

10分钟阅读

互联网

  繁體 雙語

问题:

确定bash中的变量是否为空("的最佳方法是什么?

我已经听说,我建议 if ["x$variable" ="x" ]

那是正确的way? ( 必须有更简单的内容)


回答 1:

如果变量是未设置的或者设置为空字符串("",则这将为 return true。


if [ -z"$VAR" ];




回答 2:

在Bash中,当不需要支持不支持的shell的可以移植性时,应始终使用双括号语法:

以下任何一项:


if [[ -z $variable ]]


if [[ -z"$variable" ]]


if [[! $variable ]]


if [[!"$variable" ]]



在Bash中,使用双方括号,不需要引号。 你可以简化对变量的测试,该变量不包含值,但包含:


if [[ $variable ]]



这里语法与 ksh ( 至少,) 兼容。 它不能在纯POSIX或者较老的Bourne shell ( 如sh或者 dash ) 中工作。

有关double和single方括号之间差异的详细信息,请参见 and和 BashFAQ/031

你可以测试是否明确地取消了变量( 与空字符串不同):


if [[ -z ${variable+x} ]]



其中"x"是任意的。

如果要知道变量是否为空,但不确定:


if [[ -z $variable && ${variable+x} ]]




回答 3:

bash ( 以及任何兼容 shell的) 中的变量可以处于以下三种状态之一:

  • 取消设置
  • 设置为空字符串
  • 设置为-非空-字符串

大多数时候,只需知道变量是否被设置为 非空 字符串,但是有时候很重要。

下面是如何测试各种可能性的示例,它可以在bash或者任何兼容的shell 中工作:


if [ -z"${VAR}" ]; then


 echo"VAR is unset or set to the empty string"


fi


if [ -z"${VAR+set}" ]; then


 echo"VAR is unset"


fi


if [ -z"${VAR-unset}" ]; then


 echo"VAR is set to the empty string"


fi


if [ -n"${VAR}" ]; then


 echo"VAR is set to a non-empty string"


fi


if [ -n"${VAR+set}" ]; then


 echo"VAR is set, possibly to the empty string"


fi


if [ -n"${VAR-unset}" ]; then


 echo"VAR is either unset or set to a non-empty string"


fi



以下是相同的内容,但在方便的表格形式中:


 +-------+-------+-----------+


 VAR is: | unset | empty | non-empty |


+-----------------------+-------+-------+-----------+


| [ -z"${VAR}" ] | true | true | false |


| [ -z"${VAR+set}" ] | true | false | false |


| [ -z"${VAR-unset}" ] | false | true | false |


| [ -n"${VAR}" ] | false | false | true |


| [ -n"${VAR+set}" ] | false | true | true |


| [ -n"${VAR-unset}" ] | true | false | true |


+-----------------------+-------+-------+-----------+



如果 VAR 未设置为空,则 ${VAR+foo} 构造扩展到空字符串,如果将 VAR 设置为任何( 包含空字符串),则为 foo

如果设置( 包括设置为空字符串),${VAR-foo} 构造将扩展到 VAR的值,如果未设置,则为 foo。 这对于提供用户可以重写的默认值( 比如。${COLOR-red} 说要使用 red 除非变量 COLOR 已经设置好了) 很有用。

原因是 [ x"${VAR}" = x ] 常常建议测试变量是否已经被取消或者设置为空字符串,因为 [ 命令( 也称为 test )的某些实现是错误的。 如果 VAR 设置为类似 -n的东西,那么某些实现在给定时会做错误的事情 ["${VAR}" ="" ] 因为 [的第一个参数被错误地解释为 -n 运算符,而不是字符串。


回答 4:

-z 是最好的方法。

我使用的另一个选项是设置变量,但它可以被另一个变量覆盖,例如


export PORT=${MY_PORT:-5432}



如果 $MY_PORT 变量为空,则 PORT 设置为 5432,否则端口设置为 MY_PORT 值。 注意语法包括冒号和破折号。


回答 5:

如果你感兴趣区分空白与未设置状态的情况,请查看用于bash的-u选项:


$ set -u


$ echo $BAR


bash: BAR: unbound variable


$ [ -z"$BAR" ] && echo true


bash: BAR: unbound variable


$ BAR=""


$ echo $BAR



$ [ -z"$BAR" ] && echo true


true




回答 6:

另一个我看到 [ -z"$foo" ] 但是,我不确定为什么人们使用这种方法,任何人都知道?


["x${foo}" ="x" ]



如果你不允许取消变量( 由 set -u 或者 set -o nounset ),那么你会遇到这两种方法的麻烦。 这里有一个简单的修正:


[ -z"${foo:-}" ]



注意:这将保留你的变量 undef。


回答 7:

英镑问题 asks 如何检查变量是否是空字符串,并且已经给出了最好的答案已经为该变量 that。
但是我在一段时间内通过php编程,实际上是在php中搜索空函数in在bash中工作 working。
我发现我在bash中没有正确地理解自己的答案,但是在那个时候,在php中,像空的空函数在我的bash代码中是很。
我认为这可能发生在其他情况下,我决定在bash中转换php空函数

符合 php手册:
如果变量不存在或者其值为下列值之一,则将它的视为空变量:

  • "( 一个空字符串)
  • 0 ( 0 为整数)
  • 0.0 ( 0 作为浮点数)
  • "0"( 作为字符串的0 )
  • 空数组
  • 声明的变量,但没有值

当然,在bash中不能转换空和 false,所以它们被忽略了。


function empty


{


 local var="$1"



 # Return true if:


 # 1. var is a null string ("" as empty string)


 # 2. a non set variable is passed


 # 3. a declared variable or array but without a value is passed


 # 4. an empty array is passed


 if test -z"$var"


 then


 [[ $( echo"1" ) ]]


 return



 # Return true if var is zero (0 as an integer or"0" as a string)


 elif ["$var" == 0 2>/dev/null ]


 then


 [[ $( echo"1" ) ]]


 return



 # Return true if var is 0.0 (0 as a float)


 elif ["$var" == 0.0 2>/dev/null ]


 then


 [[ $( echo"1" ) ]]


 return


 fi



 [[ $( echo"" ) ]]


}





用法示例:


if empty"${var}"


 then


 echo"empty"


 else


 echo"not empty"


fi





演示:
以下代码段:


#!/bin/bash



vars=(


""


 0


 0.0


"0"


 1


"string"


""


)



for (( i=0; i<${#vars[@]}; i++ ))


do


 var="${vars[$i]}"



 if empty"${var}"


 then


 what="empty"


 else


 what="not empty"


 fi


 echo"VAR"$var" is $what"


done



exit



输出:


VAR"" is empty


VAR"0" is empty


VAR"0.0" is empty


VAR"0" is empty


VAR"1" is not empty


VAR"string" is not empty


VAR"" is not empty



有人说bash在bash逻辑中检查零可能导致副作用 imho imho imho using使用这个函数,并决定将这些检查 cut,只留下第一个。


回答 8:

如果unnecessary和-z是不必要的。






["$foo" ] && echo"foo is not empty"


["$foo" ] || echo"foo is indeed empty"





回答 9:

当 $FOO 被设置为空时,这就是 true:


["${FOO+x}" = x ] && [ -z"$FOO" ]




回答 10:

我个人更喜欢用更清晰的方式检查:


if ["${VARIABLE}" =="" ]; then


 echo VARIABLE is empty


else


 echo VARIABLE is not empty


fi





VAR  BASH  variable  
相关文章