取决于你的意思是存在。
是否存在已声明但未分配的变量?
是否存在已分配了空列表的数组(或哈希)变量?
做了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
以及bash
4.4以上,这里还有:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
它将报告已设置或声明的变量。
$somevar
的值/字符串,如果变量不存在:${somevar:=42}
。