Bash条件表达式(-v)检查是不是设置了变量[重复]

Posted

技术标签:

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

在尝试检查 bash 中是否设置了变量时,我发现了 bash 条件表达式:-v(here:如果设置了 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

【问题讨论】:

【参考方案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

以上是关于Bash条件表达式(-v)检查是不是设置了变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查变量是不是未设置并在我的 bash 前奏中使用 set -u? [复制]

想要通过将输出重定向到变量来检查命令是不是成功

nginx地址重写模块

在bash中取消设置变量检查

检查变量是不是设置在全局范围内?

求Bash Shell脚本,判定文件是不是存在。