Bash - 需要可选参数但未传递用于 getopts
Bash - optional argument required but not passed for use in getopts
如何在需要参数的 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)
失败时,getopts
将 OPTION 设置为问号 (?
)。您应该将其添加到您的案例陈述中。如前所述,这是一个 shell 通配符,需要转义。
getopts
是 bash
的 built-in 特征。除了检查显式 ?
字符外,您还可以使用 bash
变量 OPTERR
,如 Using getopts in bash shell script to get long and short command line options.[=23 中所述=]
查找此信息的最佳位置是在 bash
的文档中。奇怪的是(鉴于 bash
中的扩展数),它位于标题为 4.1 Bourne Shell Builtins, and indeed there is a POSIX getopts for reference. The OPTERR
variable, however, is a bash
extension.
的部分中
这里有几点:
# 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 "[=10=]: -$OPTARG needs a value" >&2;
exit 2
;;
\?) echo "[=10=]: unknown option -$OPTARG" >&2;
exit 3
;;
esac
done
选项列表中的前导“:”允许我们进行自己的错误处理。如果提供了未知选项,则 OPTION
将设置为 ?
。请注意,在 case
语句中,它必须被转义(以 \
为前缀),否则它将匹配任何单个字符。
如果未向选项提供值,则 OPTION
设置为 :
。不幸的是,如果有人这样做,这无济于事:
./x -t -h
因为 -h
将被视为选项 -t
的 OPTARG
。因此额外的测试。
请注意,所有错误消息都会转到标准错误 (>&2
)。要停止脚本的执行,我们使用 exit
后跟 0-255 范围内的数字。唯一具有特定含义的数字是零,这意味着成功。 1-255这几个数字,我们可以任意选择,但都是失败的意思。
使用你的例子:
./x.sh -t -h
You entered -h
Invalid value -h given to -t
./x.sh -h -t aa
Hi
You entered aa
./x.sh -h -t
Hi
./x.sh: -t needs a value
./x.sh -t tea -c
You entered tea
./x.sh: unknown option -c
如何在需要参数的 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)
失败时,getopts
将 OPTION 设置为问号 (?
)。您应该将其添加到您的案例陈述中。如前所述,这是一个 shell 通配符,需要转义。
getopts
是 bash
的 built-in 特征。除了检查显式 ?
字符外,您还可以使用 bash
变量 OPTERR
,如 Using getopts in bash shell script to get long and short command line options.[=23 中所述=]
查找此信息的最佳位置是在 bash
的文档中。奇怪的是(鉴于 bash
中的扩展数),它位于标题为 4.1 Bourne Shell Builtins, and indeed there is a POSIX getopts for reference. The OPTERR
variable, however, is a bash
extension.
这里有几点:
# 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 "[=10=]: -$OPTARG needs a value" >&2;
exit 2
;;
\?) echo "[=10=]: unknown option -$OPTARG" >&2;
exit 3
;;
esac
done
选项列表中的前导“:”允许我们进行自己的错误处理。如果提供了未知选项,则 OPTION
将设置为 ?
。请注意,在 case
语句中,它必须被转义(以 \
为前缀),否则它将匹配任何单个字符。
如果未向选项提供值,则 OPTION
设置为 :
。不幸的是,如果有人这样做,这无济于事:
./x -t -h
因为 -h
将被视为选项 -t
的 OPTARG
。因此额外的测试。
请注意,所有错误消息都会转到标准错误 (>&2
)。要停止脚本的执行,我们使用 exit
后跟 0-255 范围内的数字。唯一具有特定含义的数字是零,这意味着成功。 1-255这几个数字,我们可以任意选择,但都是失败的意思。
使用你的例子:
./x.sh -t -h
You entered -h
Invalid value -h given to -t
./x.sh -h -t aa
Hi
You entered aa
./x.sh -h -t
Hi
./x.sh: -t needs a value
./x.sh -t tea -c
You entered tea
./x.sh: unknown option -c