“冒号”和“美元问号”可以组合起来检查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