sh 中冒号和美元问号如何组合?

sh 中冒号和美元问号如何组合?

“冒号”和“美元问号”可以组合起来检查sh脚本是否有参数并将其直接分配给感兴趣的变量:

cmd=${1:? "Usage: $0 {build|upload|log}"}

有人可以一步步解释它是如何工作的,以及我在哪里可以找到其实现的详细信息吗?例如,我希望能够调用函数而不是打印到stderr.

help() {
  echo $"Usage: $0 {build|upload|log}"
  exit 1
}
cmd=${1:? help}

为什么这是不可能的?

答案1

这涵盖在变量扩展:

${parameter:?word}

If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

因此,如果没有argument执行脚本,则该变量cmd将被help写入标准输出并返回到 shell。

然而,它只是读入并没有执行。如果你用反引号括起来,那么它将被执行并运行Usage函数:

help() {
  echo "Usage: $0 {build|upload|log}"
}
cmd=${1:? `help`}

不幸的是,这仍然会出现 stderr,正如变量扩展的设计目的。

您也可以执行以下操作:

cmd=${1:-help}
$cmd

相关内容