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)检查是不是设置了变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章