关于shell:如何在Bash中查找变量是否为空

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

命令man test是你的朋友。


推论:

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

如果设置了变量,则打印yes。设置变量时,${foo:+1}返回1,否则返回空字符串。


1
2
["$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}


如果变量未设置或设置为空字符串("),则返回true

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

顺便说一句,我建议使用set -u,它在读取未设置的变量时会导致错误,这样可以避免诸如

1
rm -rf $dir

您可以在这里阅读有关"严格模式"的这一点和其他最佳实践。


检查变量V是否未设置

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