【问题标题】:Bash conditional expression (-v) to check if a variable is set [duplicate]Bash条件表达式(-v)检查是否设置了变量[重复]
【发布时间】:2021-04-18 16:06:44
【问题描述】:

在尝试检查 bash 中是否设置了变量时,我发现了 bash 条件表达式:-vhere:如果设置了 shell 变量(已分配值)则为真。)。我试试代码:

#!/bin/bash
VAR="not-empty"
if [ ! -v "$VAR" ]; then
        echo "unset"
else 
        echo "set: $VAR"
fi

但是,即使我在代码开头分配了VAR,输出也是unset

我找到了How to check if a variable is set in Bash? 问题,并尝试将! -v 替换为-z 以检查字符串变量VAR。输出为set: non-empty

任何人都可以帮助解释第一种情况(使用-v 表达式)为什么输出为unset

我的 bash 版本:

GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu) 版权所有 (C) 2019 Free Software Foundation, Inc. 许可 GPLv3+:GNU GPL 版本 3 或更高版本http://gnu.org/licenses/gpl.html

【问题讨论】:

    标签: linux bash conditional-operator


    【解决方案1】:

    在检查它是否已设置时不需要 $:

    if [[ ! -v VAR ]]; then
        echo "unset"
    else 
        echo "set: $VAR"
    fi
    

    【讨论】:

    • 你能解释为什么当我们不使用$ 时它会起作用吗?
    • $ 通常扩展一个变量或命令。在这种情况下,我们没有扩展。
    • 不是不能使用$,而是-v的参数应该是变量名作为参数。如果您想检查是否设置了VAR,那么VAR,而不是$VAR 的扩展,是您想要的参数。
    【解决方案2】:

    查看 bash 的手册,我发现:

       -v varname
              True if the shell variable varname is set (has been assigned a value).
    

    但问题是:

    VAR="not-empty"
    [ ! -v "$VAR" ]
    

    不正确,但执行不同的测试。它检查是否设置了一个名为“not-empty”的变量。

    你应该这样测试:

    #!/bin/bash
    VAR="not-empty"
    if [ ! -v VAR ]; then
            echo "unset"
    else 
            echo "set: $VAR"
    fi
    

    【讨论】:

    • 这是一个更好的答案,除了它使用[ 而不是[[。当您绝对需要使用 shell 内置的 test 实现并针对 ksh 系列 shell(如 bash)时,[[ 是更好的选择:即使现代 shell 确实如此 通常有内置的[ 实现,这通常是一种性能增强,唯一标准保证的行为是为/usr/bin/[ 指定的行为,它(作为外部命令)看不到shell 变量和@987654321 @拥有-v
    猜你喜欢
    • 2013-08-03
    • 2011-04-05
    • 2014-09-15
    • 1970-01-01
    • 2017-10-28
    • 2012-10-16
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多