取决于你的意思是存在。
是否存在已声明但未分配的变量?
是否存在已分配了空列表的数组(或哈希)变量?
做了nameref变量指向一个变量,目前未分配存在?
你认为$-,$#,$1变量?(POSIX没有)。
在类似伯恩的贝壳中,规范的方式是:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
这适用于标量等参数来判断一个变量被分配一个值(自动清空与否,从环境,assigments, read,for或其他)。
对于有壳typeset或declare命令,因为这将不报告设置已变量声明,但不分配除zsh。
对于支持阵列,除了壳yash和zsh,不会作为报告设定,除非指数之0的元件已被设定数组变量。
对于bash(但不是ksh93也不zsh),类型变量关联数组,这将不报告它们作为一组,除非他们的密钥已经被设置为“0”的元素。
对于ksh93和bash,对于nameref类型的变量,仅当nameref引用的变量本身被视为set时,才返回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以及bash4.4以上,这里还有:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
它将报告已设置或声明的变量。
$somevar的值/字符串,如果变量不存在:${somevar:=42}。