如何在需要参数的bash脚本中标记错误 对于getopt,但用户没有通过它?例如下面的脚本 需要选项“t”的参数:
#!/bin/bash
while getopts "ht:" OPTION
do
case $OPTION in
h)
echo "Hi"
;;
t)
echo You entered $OPTARG
;;
esac
done
我想抓住以下错误并打印其他内容 出口。目前,它继续评估更多的参数 离开。
$ ./x.sh -h -t aa # (this is fine)
Hi
You entered aa
$ ./x.sh -h -t # (this is not handled)
Hi
No arg for -t option # (this error is being printed by bash)
答案 0 :(得分:2)
如果失败,getopts
会将OPTION设置为问号(?
)。您应该将它添加到您的case语句中。如上所述,这是一个shell globbing字符,需要转义。
getopts
是bash
的内置功能。除了检查明确的?
字符外,您还可以使用 Using getopts in bash shell script to get long and short command line options 中提到的bash
变量OPTERR
。
查找此信息的最佳位置在bash
的文档中。奇怪的是(考虑到bash
中的扩展数量),它位于标题为 4.1 Bourne Shell Builtins 的部分中,确实有一个POSIX getopts供参考。但是,OPTERR
变量是bash
extension。
答案 1 :(得分:2)
这里有几点:
# Note the leading ':'
while getopts :ht: OPTION
do
case $OPTION in
h)
echo "Hi"
;;
t)
echo "You entered $OPTARG"
if [[ ${OPTARG:0:1} == '-' ]]; then
echo "Invalid value $OPTARG given to -$OPTION" >&2
exit 1
fi
;;
:) echo "$0: -$OPTARG needs a value" >&2;
exit 2
;;
\?) echo "$0: unknown option -$OPTARG" >&2;
exit 3
;;
esac
done
领先':'在选项列表上允许我们自己进行错误处理。如果提供了未知选项,则OPTION
设置为?
。请注意,在case
语句中,必须对其进行转义(以\
为前缀),否则它将匹配任何单个字符。
如果未向选项提供值,则OPTION
设置为:
。不幸的是,如果有人这样做,这没有任何帮助:
./x -t -h
因为-h
将被视为选项OPTARG
的{{1}}。因此额外的测试。
请注意,所有错误消息都转到标准错误(-t
)。要停止执行脚本,我们使用>&2
后跟0-255范围内的数字。具有特定含义的唯一数字为零,这意味着成功。数字1-255可以具有我们选择的任何含义,但都意味着失败。
使用您的示例:
exit