小编典典

变量名后的'-'(破折号)在这里做什么?

linux

if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi

在哪里可以找到参考?谢谢。


阅读 439

收藏
2020-06-07

共1个答案

小编典典

a ${...}中的变量称为“参数扩展”。在在线手册或实际手册中
搜索该术语(第792行)。 该形式是在形式上相似。仅在展开前一行(行810)说明了差异:
${var-}``${var:-}``:-

… bash测试未设置或为null的参数。省略冒号只会对未设置的参数进行测试。

因此,这种形式是测试仅当变量被复位( 不为空),并且替换整个扩张${...}为后的值-,在这种情况下是

因此,${var-}变为:

  1. 当var具有值(而不是null)时,var的值。
  2. 另外,当var为null:时,var的值(冒号:丢失!)''也因此为null。
  3. ''如果未设置var ,则-之后的值(在这种情况下为null )。

所有这些实际上就是:

  1. 展开为''var未设置或为null时。
  2. 扩展到var的值(当var具有值时)。

因此,扩展没有改变var的值,也没有扩展,只是在shell nounset设置了选项的情况下避免了可能的错误。

此代码将在以下两种用途上均停止$var

#!/bin/bash
set -u

unset var

echo "variable $var"
[[ $var ]] && echo "var set"

但是,此代码将正确运行:

#!/bin/bash
set -u

unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"
2020-06-07