如何检查“if”语句中是否存在变量?

如何检查“if”语句中是否存在变量?

我需要检查语句中变量是否存在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

这适用于标量变量和其他参数,以判断变量是否已被分配一个值(空或非空,自动,从环境,分配,readfor其他)。

对于具有typesetordeclare命令的 shell,不会报告为已经存在的变量宣布但不是分配的(请注意,在 中zsh,声明变量会分配一个值,如果未指定,则为默认值)。

对于支持数组的 shell,除了 和yash不会zsh报告为数组变量,除非已设置索引 0 的元素。

对于bash(但不是ksh93nor zsh),对于类型变量关联数组,这不会将它们报告为除非它们的键“0”元素已被设置。

对于ksh93bash,对于类型变量名称引用,仅当考虑 nameref 引用的变量本身时才返回 true

对于kshzshbash,可能更好的方法可能是:

if ((${#var[@]})); then
  echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi

对于ksh93zshbash4.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

相关内容