【问题标题】:Using quotes with "${parameter:-word}" Parameter Expansion使用带有 "${parameter:-word}" 参数扩展的引号
【发布时间】:2014-06-17 10:25:10
【问题描述】:

如果未设置变量,使用${parameter:-word} 形式的参数扩展来计算默认值时,引号的最佳做法是什么?

例如,假设一个设置了-u 的 Bash shell 脚本(在评估未定义或未设置的变量时生成错误),以测试变量是否具有值,编写等效的最佳方法是什么if [[ -z "$FOO" ]]?

if [[ -z "${FOO:-}" ]]

if [[ -z ${FOO:-""} ]]

还是别的什么?

【问题讨论】:

  • 别的:[[ -z ${FOO:-} ]]
  • 如果您考虑到 Bourne Shell 兼容性,您可能更喜欢 [ -z "${FOO:-}" ] 与单括号测试和双引号的变量。

标签: bash shell quotes variable-expansion


【解决方案1】:

我喜欢这样做

if (( ! ${#FOO} ))

Example

【讨论】:

  • 如果FOO 未设置(OP 提到set -u),这将发出嘶嘶声。
【解决方案2】:

如果您使用的是最新版本的 bash(撰写本文时为 4.2),则可以使用 -v 选项来测试是否设置了变量,而无需尝试扩展它。

if [[ -v FOO ]]; then
    echo "FOO=$FOO"
else
    echo "FOO not set"
fi

如果您使用的是旧版本,我会使用

if [[ -z ${FOO:-} ]];

引号不是必需的,IMO 这看起来最干净。

【讨论】:

  • +1;具体来说,-v 运算符是在 4.2 中引入的 - 请参阅 tiswww.case.edu/php/chet/bash/NEWS。旧版本:-z ${FOO:-}最强大的形式,适用于所有情况;但是,如果 bash 不是以 -u 开头或执行了 set -u (set -o nounset),[[ -z $FOO ]] 也可以工作。
  • 你也不需要:
猜你喜欢
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多