为什么[[-z]]和[[-v]]具有不同的语法?

菲利普·柯比布莱德(Philip Kirkbride)

如果我想执行一些命令,并且没有设置给定的变量,那么我使用的是:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

泛型方法和泛型类型为什么会有不同类型的介绍语法?

为什么在调用函数之前和函数内部我的go函数参数具有不同的大小?

为什么json.Marshal和json.Unmarshal具有不同的签名

为什么用户定义的字符串文字和整数文字具有不同的行为?

为什么FilterInputStream和FilterOutputStream在其构造函数中具有不同的访问修饰符?

为什么ARFaceAnchor具有负Z位置?

为什么GeneratorExit和StopIteration具有不同的基类?

Clojure:为什么字符串上的=和.equals具有不同的性能?

为什么conj和cons具有不同的参数顺序

为什么Boost对于Windows和Linux具有不同的下载?

为什么canvas.toBlob和canvas.toDataURL具有不同的返回类型

为什么两个具有相同文本和编码但大小不同的文件?

为什么xyplot()和dotplot()生成具有相同参数的不同图?

为什么结构体和可变结构体具有不同的默认相等运算符?

为什么相似的代码具有不同的运行时和内存使用率?

为什么空数组的类型在结构的内部和外部具有不同的大小?

当x = 10 ^(30),y = -10 ^(30)和z = 1时,为什么(x + y)+ z和x +(y + z)不同?

为什么`Regex`在src / test和src / androidTest中具有不同的行为?

[[$ a == z *]]和[$ a == z *]有什么区别?

为什么带有-z选项的tar每次都会创建具有不同哈希值的存档

为什么“文件foo.css”和“文件bar.css”具有不同的输出?

为什么sudo -H pip -V和pip -V不同?

为什么Joomla引导程序和官方引导程序具有不同的CSS?

为什么跨度和img元素在同一行中具有不同的垂直位置?

为什么gdb中“ condition”和“ break”的语法不同?

为什么Z3 Online和Z3PY的结果不同?

为什么 git 为具有不同名称和位置的文件分配相同的哈希?

为什么 x * 和 * z = 3?

为什么具有绝对位置和 z-index 的元素不起作用?