如何在Bash脚本中查找variables是否为空

如何检查bash中的variables是否为空?

在bash中,至less下面的命令testing$ var是否为空

if [[ -z "$var" ]] 

命令man test是你的朋友。

假设bash:

 var="" if [ -n "$var" ]; then echo "not empty" else echo "empty" fi 

我也看到了

 if [ "x$variable" = "x" ]; then ... 

这显然是非常强大和独立的壳。

而且,“空”和“未设”也有区别。 请参阅如何判断string是否未在bash shell脚本中定义? 。

 if [ ${foo:+1} ] then echo "yes" fi 

打印yes如果variables设置。 ${foo:+1}将在variables设置时返回1,否则返回空string。

 [ "$variable" ] || echo empty : ${variable="value_to_set_if_unset"} 
 if [[ "$variable" == "" ]] ... 

这个问题如何检查一个variables是否是一个空string,并已经给出了最好的答案。
但是,在经过了一段时间的PHP编程之后,我到达了这里,而实际上我正在search的东西是像在bash shell中工作的php中空白函数
在阅读答案后,我意识到我没有在bash中正确思考,但无论如何,在PHP这样的函数将在我的bash代码中非常方便。
正如我认为这可能发生在其他人身上,我决定在bash中转换php空function

根据php手册 :
如果一个variables不存在或者它的值是下列值之一,则该variables被认为是空的:

  • “”(一个空string)
  • 0(0作为整数)
  • 0.0(0作为浮点数)
  • “0”(0作为一个string)
  • 一个空的数组
  • 一个variables声明,但没有价值

当然nullfalse的情况下不能在bash中转换,所以它们被省略了。

 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逻辑中,在这个函数中的零检查可能会导致一些问题,任何使用这个函数的人都应该评估这个风险,也许会决定把这些检查关掉,只留下第一个。

如果一个variables未被设置或设置为空string(“”),这将返回true

 if [ -z "$MyVar" ] then echo "The variable MyVar has nothing in it." elif ! [ -z "$MyVar" ] then echo "The variable MyVar has something in it." fi 

您可能想要区分未设置的variables和已设置的variables并清空:

 is_empty() { local var_name="$1" local var_value="${!var_name}" if [[ -v "$var_name" ]]; then if [[ -n "$var_value" ]]; then echo "set and non-empty" else echo "set and empty" fi else echo "unset" fi } str="foo" empty="" is_empty str is_empty empty is_empty none 

结果:

 set and non-empty set and empty unset 

顺便说一下,我推荐使用set -u ,这会在读取未设置的variables时导致错误,这可以帮助您避免类似的灾难

 rm -rf $dir 

您可以在这里阅读关于“严格模式”的这个和其他最佳实践。

检查variablesv是否未设置

 if [ "$v" == "" ]; then echo "v not set" fi