这是一个例子https://unix.stackexchange.com/a/56846/674
测试是否已声明任何类型的变量的另一种特定于 bash 的方法是检查它是否在中列出
${!PREFIX*}
:case " ${!foobar*} " in *" foobar "*) echo "foobar is declared";; *) echo "foobar is not declared";; esac
如果我是正确的,为了使参数未声明,我们使用
unset
内置的。这个unset
案例就像引文所说的那样,$ unset foobar $ case " ${!foobar*} " in > *" foobar "*) echo "foobar is declared";; > *) echo "foobar is not declared";; > esac foobar is not declared
但
declare
d 情况没有:$ unset foobar $ declare foobar $ case " ${!foobar*} " in > *" foobar "*) echo "foobar is declared";; > *) echo "foobar is not declared";; > esac foobar is not declared
这是测试参数是否已声明的正确方法吗?
- 另外
" ${!foobar*} "
,为什么参数扩展前后有空格?当foobar
它是数组或字典以及它是变量但不是数组或字典时它是否有效?
答案1
看起来你必须用一个值声明变量(可以为空):
unset foobar; declare foobar=
case 语句将生成“foobar 已声明”。
您使用引号和空格,以便
*" foobar "*
可以检测到特定的变量名称列表返回的变量名数量${!foobar*}
:$ unset foobar; foobarbaz=1; foobarquz=2 $ echo " ${!foobar*} " foobarbaz foobarquz
case 语句将生成“foobar 未声明”。