How to find whether or not a variable is empty in Bash
如何检查bash中的变量是否为空?
在bash中,如果$var为空,则至少进行以下命令测试:
1 2 3 | if [[ -z"$var" ]]; then #do what you want fi |
命令
推论:
1 2 3 4 5 6 7 | var="" if [ -n"$var" ]; then echo"not empty" else echo"empty" fi |
我也见过
1 | if ["x$variable" ="x" ]; then ... |
这显然是非常强大和壳独立。
此外,"空"和"未设置"也有区别。看看如何判断一个字符串是否在bash shell脚本中定义?.
1 2 3 4 | if [ ${foo:+1} ] then echo"yes" fi |
如果设置了变量,则打印
1 2 | ["$variable" ] || echo empty : ${variable="value_to_set_if_unset"} |
如果变量未设置或设置为空字符串("),则返回
1 2 3 4 5 6 7 | 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 |
1 | if [["$variable" =="" ]] ... |
这个问题询问如何检查变量是否是空字符串,并且已经给出了最佳答案。但我是在用PHP编程一段时间后来到这里的,我实际上搜索的是一个类似于PHP中在bash shell中工作的空函数的检查。在阅读了答案之后,我意识到我在bash中的思考不正确,但无论如何,在那一刻,像php中的empty这样的函数在我的bash代码中会非常方便。因为我认为这可能发生在其他人身上,所以我决定在bash中转换php空函数。根据PHP手册:如果变量不存在或其值为以下值之一,则认为该变量为空:
- "(空字符串)
- 0(0为整数)
- 0.0(0为浮点数)
- "0"(0作为字符串)
- 空数组
- 已声明但没有值的变量
当然,不能在bash中转换空值和假值,因此省略了它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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"" ) ]] } |
使用示例:
1 2 3 4 5 6 | if empty"${var}" then echo"empty" else echo"not empty" fi |
演示:以下代码段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/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 |
输出:
1 2 3 4 5 6 7 | 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逻辑中,此函数中对零的检查可能会导致一些附加问题imho,任何使用此函数的人都应该评估此风险,并可能决定关闭这些检查,只留下第一个检查。
您可能希望区分未设置的变量和设置为空的变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
结果:
1 2 3 | set and non-empty set and empty unset |
顺便说一句,我建议使用
1 | rm -rf $dir |
您可以在这里阅读有关"严格模式"的这一点和其他最佳实践。
检查变量V是否未设置
1 2 3 | if ["$v" =="" ]; then echo"v not set" fi |