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

标签 linux bash

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

我在哪里可以找到这方面的引用资料?谢谢。

最佳答案

${...} 中的变量称为“参数扩展”。
搜索该词 in the online manual ,或实际手册(第 792 行)。
${var-} 形式类似于 ${var:-}:- 扩展(第 810 行)前一行解释了差异:

... bash tests for a parameter that is unset or null. Omitting the colon results in a test only for a parameter that is unset.

因此,此表单仅在未设置变量( 不为空)时进行测试,并替换整个扩展 ${...} 之后的值-,在本例中为 null

因此,${var-} 变为:

  1. 当 var 有值(非空)时 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"

关于linux - 变量名后的 '-'(破折号)在这里做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674713/

相关文章:

linux - 如何使服务器不记录(存储)用户 IP 和用户代理?

linux - 如何通过Linux命令提示符对齐文本?

bash - 在 shell 脚本中使用 ssh 登录在服务器上创建 cron 条目

sql - 截断所有 MySql 表的 shell 脚本

bash - 通过 bash 脚本登录 Heroku

linux - 如何让SSH命令执行超时

linux - 期待 bash 脚本中的命令

php - Symfony 缓存 :clear Failed to remove directory

linux - Jenkins 和 Vagrant 的情况很奇怪

c - 在 C 中设置环境变量