如果我想执行一些命令,并且没有设置给定的变量,那么我使用的是:
if [[ -z "$a" || -z "$v" ]]
then
echo "a or b are not set"
fi
但是相同的语法不适用于-v
,我必须使用:
if [[ -v a && -v b ]]
then
echo "a & b are set"
fi
这背后的历史是什么?我不明白为什么语法会不同。我读到这-v
是bash (4.2)的新增功能?
测试运算符-v
和-z
只是不一样。
运算符-z
告诉一个字符串是否为空。因此,确实可以[[ -z "$a" ]]
很好地近似“a
未设置变量”,但不是一个完美的近似值:
如果a
将其设置为空字符串而不是未设置,则表达式将产生true ;
如果a
未设置并且nounset
启用了该选项,则封闭脚本将失败。
另一方面,即使在极少数情况下,-v a
也将精确地“a
设置变量”。应该清楚的是,传递$a
而不是a
传递-v
是不正确的,因为它将在测试操作员看到之前扩展可能未设置的变量。因此,必须检查该变量的名称所指向的变量,并判断该变量是否已设置,这是该操作员任务的一部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句