![如何检查“if”语句中是否存在变量?](https://linux22.com/image/67780/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E2%80%9Cif%E2%80%9D%E8%AF%AD%E5%8F%A5%E4%B8%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我需要检查语句中变量是否存在if
。一些效果:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
最接近的问题是这,这实际上并没有回答我的问题。
答案1
在现代 bash(4.2 及更高版本)中:
[[ -v name_of_var ]]
从help test
:
-v VAR,如果设置了 shell 变量 VAR,则为 True
答案2
取决于你的意思存在。
是否已声明但未赋值的变量存在?
是否为已分配空列表的数组(或散列)变量存在?
nameref 变量是否指向当前未分配的变量存在?
你考虑$-
, $#
,$1
变量吗? (POSIX 没有)。
在类似 Bourne 的 shell 中,规范的方式是:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
这适用于标量变量和其他参数,以判断变量是否已被分配一个值(空或非空,自动,从环境,分配,read
或for
其他)。
对于具有typeset
ordeclare
命令的 shell,不会报告为放已经存在的变量宣布但不是分配的(请注意,在 中zsh
,声明变量会分配一个值,如果未指定,则为默认值)。
对于支持数组的 shell,除了 和yash
不会zsh
报告为放数组变量,除非已设置索引 0 的元素。
对于bash
(但不是ksh93
nor zsh
),对于类型变量关联数组,这不会将它们报告为放除非它们的键“0”元素已被设置。
对于ksh93
和bash
,对于类型变量名称引用,仅当考虑 nameref 引用的变量本身时才返回 true放。
对于ksh
、zsh
和bash
,可能更好的方法可能是:
if ((${#var[@]})); then
echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi
对于ksh93
、zsh
和bash
4.4 或更高版本,还有:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
它将报告已设置或声明的变量。
答案3
正如在答案中提到的所以,这是一种检查方法:
if [ -z ${somevar+x} ]; then echo "somevar is unset"; else echo "somevar is set to '$somevar'"; fi
其中 ${somevar+x} 是参数扩展,如果 var 未设置,则计算结果为 null,否则替换字符串“x”。
-n
正如另一个答案所建议的,使用只会检查变量是否包含空字符串。它不会检查它的存在。
答案4
if set|grep '^somevar=' >/dev/null;then
echo "somevar exists"
else
echo "does not exist"
fi