我正在编写一个 shell 脚本,并且对 getopts 进行参数解析很陌生。我有 1 个可选参数和 2 个强制参数,我想要做的是确保只传递一个强制参数。目前存在基本验证,但长期来看实际上毫无用处。我查看了使用 if 条件的其他示例,但也失败了。在案例中使用标志并通过检查各个状态来调用函数也可以打印所有内容。我想要的是确保只使用 1 个强制参数,并在传递超过 1 个参数时抛出错误。现在,所有选项都按指定的顺序运行。这是代码
#!/bin/bash
USAGE="Usage : $0 [-r N] (-a|-b)"
#Prompts when there are no arguments passed
if [ "$#" -le 0 ]; then
echo $USAGE
exit 2
fi
#the option parsing
while getopts ':n:ab' option
do
case $option in
r)
numlim=$OPTARG
;;
a)
task1
;;
b)
task2
;;
*)
echo "Unknown Param"
echo $USAGE
;;
esac
done
我想要的是关于如何以指定的方式设计代码的提示。
答案1
设置一个变量来决定在循环中运行哪个任务getopts
,然后手动检查是否只选择了一个任务。您可以通过多种方式做到这一点,例如:
#!/bin/sh
task=
set_task() {
if [ -n "$task" ]; then
echo "only one of -a and -b may be used" >&2
exit 1
fi
task=$1
}
while getopts ':n:ab' option; do
case $option in
a) set_task a;;
b) set_task b;;
*) echo "unknown option" >&2
exit 1;;
esac
done
if [ "$task" = a ]; then
echo do task a...
elif [ "$task" = b ]; then
echo do task b...
else
echo "invalid or unspecified task" >&2
exit 1
fi