【问题标题】:Why use expressions like "${foo:-}" in bash? [duplicate]为什么在 bash 中使用像“${foo:-}”这样的表达式? [复制]
【发布时间】:2021-10-30 04:26:48
【问题描述】:

我可以在 python venv activate bash 脚本中看到以下代码。 (以下代码针对我的问题稍作修改)

if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
    # do something
fi
# .......
# .......
if [ -z "${PYTHONHOME:-}" ] ; then
    # do something
fi

使用表达式"${_OLD_VIRTUAL_PATH:-}" 代替"$_OLD_VIRTUAL_PATH" 有什么好处?似乎两者都产生相同的结果。有什么原因吗?

【问题讨论】:

  • this 是脚本吗?我只是想了解一些上下文。我没有看到-z "${PYTHONHOME:-}",但我确实看到了一些类似的东西,例如-z "${VIRTUAL_ENV_DISABLE_PROMPT:-}"
  • @Andy This answer 涵盖了您为什么要使用它,但我仍然不明白为什么冒号在那里。如果变量为空,为什么用空字符串替换它? null 和空字符串之间有区别吗,可能是整数变量? (declare -i var)
  • @AndyRay :没有。你提到的问题是关于:- 的一般用法和shell 参数扩展。我的问题是使用${foo:-} 而不是$foo 是否会改变脚本结果。
  • @wjandrea 是的。我为我的问题稍微修改了脚本。
  • 如果使用set -u,如果未设置变量,您将收到仅$var 的错误。这就是他们使用${var:-} 的原因。请注意,该脚本旨在获取源代码,因此他们无法控制用户如何配置其终端(set -u 可能会或可能不会使用)。

标签: bash shell script parameter-expansion


【解决方案1】:

好处是当使用set -u 运行并且未设置变量时,shell 不会退出。

set -u
unset _OLD_VIRTUAL_PATH

if [ -n "$_OLD_VIRTUAL_PATH" ]; then  # will exit the script
    : do something
fi
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then  # script will continue
   : do something
fi

【讨论】:

  • 好答案。我可以更清楚地理解原因。
  • 但是为什么冒号在里面?如果变量为null,为什么用空字符串替换它?
  • @wjandrea 这样-z 将是真实的,then <this part> 将被执行,您通常会在其中处理错误。通常是if [[ -z "${PARAM:-}" ]]; then echo "PARAM is empty or unset, set it to run this script" >&2; exit 1; fi。在这种情况下,我看到它是-n,不知道,也许是空的很好(比如,如果在if 中设置了空的默认值)。
  • @Kamil -z 无论如何都是真的,不是吗?冒号的意思是“如果变量为null,就替换它”,但是替换的也是null,那有什么意义呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 2018-10-09
  • 2016-09-11
  • 2013-05-06
相关资源
最近更新 更多