变量名称之后的' - '(短划线)在这里做什么?

Ank*_*wal 15 linux bash

if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到关于此的参考?谢谢.

小智 19

a ${...}中的变量称为"参数扩展".在在线手册或实际手册中
搜索该术语(第792行). 该形式是在形式上相似.在扩展之前只有一行解释了差异(第810行):
${var-}${var:-}:-

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

因此,此形式仅在未设置变量(并且不为null)时进行测试,并替换${...}该值之后的整个扩展-,在本例中为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"
Run Code Online (Sandbox Code Playgroud)

但是,此代码将运行没有错误:

#!/bin/bash
set -u

unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"
Run Code Online (Sandbox Code Playgroud)


the*_*fog 5

它是一个 bash 参数扩展,用于检查变量是否未设置

解释

当您在 bash 脚本中使用${ZSH_VERSION-WORD}与 相反时,bash 将执行额外的逻辑$ZSH_VERSION

if $ZSH_VERSION is set
then 
    simply use the value of $ZSH_VERSION as per normal

elseif

$ZSH_VERSION is NOT set 
then
    use value of WORD - which isnt provided in your case - so null
Run Code Online (Sandbox Code Playgroud)

用来

参考

文档中介绍了基本参数扩展man bash(bash 手册页第 939 行)。

请参阅:POSIX

另请参阅此答案