分析棘手的衬里并列出有用的衬里

分析棘手的衬里并列出有用的衬里

见过如下所示的衬里,并花了一点时间来分析它的确切使用和工作原理 - 例如,如果未设置,则将值设置为后面的值。

export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}

当我搜索某些东西时,我没有看到像“:-”这样棘手的文字。是否有记录的此类有用单行代码的方便列表或可供参考的特定手册页?

答案1

除了关于查阅文档的其他很好的答案之外,我总是求助于 Bash 的调试工具来看看发生了什么。

您可以通过将感兴趣的命令包装在块中来启用和禁用它,如下所示:

$ set -x; command_to_watch; set +x

例子

$ set -x; export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}; set +x
+ export JDK_HOME=/some/path/java-1.7
+ JDK_HOME=/some/path/java-1.7
+ set +x

在这里您可以看到变量$JDK_HOME被设置为/some/path/java-1.7。但是,如果我们将其设置为其他值:

$ export JDK_HOME=/a/path
$ echo $JDK_HOME
/a/path

并再次运行此命令:

$ set -x; export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}; set +x
+ export JDK_HOME=/a/path
+ JDK_HOME=/a/path
+ set +x

我们可以看到它没有做任何事情,这让我们知道如果变量已经设置,这个命令将不理会它,否则它将使用值 来设置它/some/path/java-1.7

证实了我们的怀疑Bash 的手册页:

${parameter:-word}
      Use Default Values.  If parameter is unset or null, the expansion of word
      is substituted.  Otherwise, the value of parameter is substituted.

答案2

阅读man bash,然后键入/Parameter Expansion(完全像这样,带有前导斜杠)。它将从该手册页中搜索相关部分;那里解释了可能的扩展修饰符。

答案3

我已经找到了附录 B 中的参考卡高级 Bash 脚本指南很有用。您的示例的相关表是表 B-4:参数替换和扩展

相关内容