AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 7503
Accepted
Brent
Brent
Asked: 2009-05-13 09:54:48 +0800 CST2009-05-13 09:54:48 +0800 CST 2009-05-13 09:54:48 +0800 CST

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

  • 772

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

我听说建议我这样做if [ "x$variable" = "x" ]

这是正确的方法吗?(必须有更直接的东西)

scripting bash variables
  • 15 15 个回答
  • 1279404 Views

15 个回答

  • Voted
  1. Best Answer
    duffbeer703
    2009-05-13T10:06:44+08:002009-05-13T10:06:44+08:00

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

    if [ -z "${VAR}" ];
    
    • 1227
  2. Dennis Williamson
    2012-02-25T19:37:43+08:002012-02-25T19:37:43+08:00

    在 Bash 中,当您不关心不支持它的 shell 的可移植性时,您应该始终使用双括号语法:

    以下任何一项:

    if [[ -z $variable ]]
    if [[ -z "$variable" ]]
    if [[ ! $variable ]]
    if [[ ! "$variable" ]]
    

    在 Bash 中,使用双方括号,引号不是必需的。您可以将包含值的变量的测试简化为:

    if [[ $variable ]]
    

    此语法与 ksh 兼容(至少 ksh93,无论如何)。它不适用于纯 POSIX 或更旧的 Bourne shell,例如 sh 或 dash。

    有关双方括号和单方括号之间差异的更多信息,请参阅我的答案和BashFAQ/031 。

    您可以测试以查看变量是否特别未设置(与空字符串不同):

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

    其中“x”是任意的。

    如果您想知道变量是否为 null 但未设置:

    if [[ -z $variable && ${variable+x} ]]
    
    • 299
  3. Richard Hansen
    2012-04-25T12:39:38+08:002012-04-25T12:39:38+08:00

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

    • 未设置
    • 设置为空字符串
    • 设置为非空字符串

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

    以下是如何测试各种可能性的示例,它可以在 bash 或任何与 POSIX 兼容的 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+foo}构造扩展为空字符串。VARfooVAR

    该${VAR-foo}构造扩展为VARif set(包括设置为空字符串)和fooif unset 的值。这对于提供用户可覆盖的默认值很有用(例如,${COLOR-red}说要使用red,除非变量COLOR已设置为某个值)。

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

    • 294
  4. Amandasaurus
    2009-06-12T05:19:09+08:002009-06-12T05:19:09+08:00

    -z是最好的办法。

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

    export PORT=${MY_PORT:-5432}
    

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

    • 44
  5. MikeyB
    2009-05-13T10:21:43+08:002009-05-13T10:21:43+08:00

    如果您有兴趣区分 set-empty 和 unset 状态的情况,请查看 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
    
    • 25
  6. errant.info
    2011-10-20T19:58:35+08:002011-10-20T19:58:35+08:00

    我见过的替代方法[ -z "$foo" ]如下,但是我不确定人们为什么使用这种方法,有人知道吗?

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

    无论如何,如果您不允许未设置的变量( byset -u或set -o nounset),那么这两种方法都会遇到麻烦。有一个简单的解决方法:

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

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

    • 8
  7. Luca Borrione
    2012-09-01T12:11:38+08:002012-09-01T12:11:38+08:00

    该问题询问如何检查变量是否为空字符串,并且已经给出了最佳答案。
    但是在经过一段时间的 php 编程后,我来到了这里,而我实际上正在搜索的是一个检查,比如在 bash shell 中工作的php 中的空函数。
    阅读答案后,我意识到我在 bash 中的思考不正确,但无论如何,在那一刻,像 php 中的空函数这样的函数在我的 bash 代码中会非常方便。
    由于我认为这可能发生在其他人身上,我决定

    根据php 手册将 bash 中的 php 空函数转换为:
    如果变量不存在或者其值为以下之一,则该变量被视为空:

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

    当然bash 中不能转换null和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 逻辑中,此函数中对零的检查可能会导致附带问题,恕我直言,任何使用此函数的人都应评估此风险,并可能决定取消这些检查,只留下第一个检查。

    • 6
  8. namewithoutwords
    2010-01-27T06:02:09+08:002010-01-27T06:02:09+08:00

    整个 if-then 和 -z 是不必要的。

    [ "$foo" ] && echo "foo 不为空"
    [ "$foo" ] || echo "foo 确实是空的"
    
    • 5
  9. Fedir RYKHTIK
    2011-12-10T07:15:29+08:002011-12-10T07:15:29+08:00

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

    if [ "${VARIABLE}" == "" ]; then
      echo VARIABLE is empty
    else
      echo VARIABLE is not empty
    fi
    
    • 5
  10. gluk47
    2015-11-10T08:46:15+08:002015-11-10T08:46:15+08:00

    我的 5 美分:还有一个比if ..., 这个更短的语法:

    VALUE="${1?"Usage: $0 value"}"
    

    如果提供了参数,则此行将设置 VALUE 并在出现错误时打印带有脚本行号的错误消息(并将终止脚本执行)。

    另一个例子可以在abs-guide中找到(搜索 «Example 10-7»)。

    • 5

相关问题

  • 如何将终端命令启动到多个选项卡中?

  • 如何最好地编写 SQL Server 2008 上选定的表和数据的脚本?

  • 获取目录总大小的 PowerShell 脚本

  • GNU 屏幕和 .bashrc

  • 在 .bashrc 中设置环境变量的最佳方法是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve