如何在 shell 脚本中强制只使用一个标志?
How to enforce only the use of one flag in a shell script?
我目前有一个使用短标记 -M
、-m
和 -b
的脚本。我只想使用一个参数,所以我只是让它在匹配标志上中断。我想更改它,以便它 returns 如果使用多个标志,则为非零代码,并且我想支持长标志(--major
、--minor
、--bug
).如何修改我现在使用的这段代码来实现?
while getopts ":Mmb" increment; do
case "${increment}" in
M)
result=1
break
;;
m)
result=2
break
;;
b)
result=3
break
;;
esac
done
也许:
has_M=0
has_m=0
has_b=0
while getopts ":Mmb" increment; do
case "${increment}" in
M) has_M=1 ;;
m) has_m=1 ;;
b) has_b=1 ;;
esac
done
shift $((OPTIND - 1))
if (( has_M + has_m + has_b > 1 )); then
echo "only one of -M -m -b is allowed" >&2
exit 1
fi
if ((has_M)); then
:# do -M stuff
elif ((has_m)); then
:# do -m stuff
elif ((has_b)); then
:# do -b stuff
fi
我目前有一个使用短标记 -M
、-m
和 -b
的脚本。我只想使用一个参数,所以我只是让它在匹配标志上中断。我想更改它,以便它 returns 如果使用多个标志,则为非零代码,并且我想支持长标志(--major
、--minor
、--bug
).如何修改我现在使用的这段代码来实现?
while getopts ":Mmb" increment; do
case "${increment}" in
M)
result=1
break
;;
m)
result=2
break
;;
b)
result=3
break
;;
esac
done
也许:
has_M=0
has_m=0
has_b=0
while getopts ":Mmb" increment; do
case "${increment}" in
M) has_M=1 ;;
m) has_m=1 ;;
b) has_b=1 ;;
esac
done
shift $((OPTIND - 1))
if (( has_M + has_m + has_b > 1 )); then
echo "only one of -M -m -b is allowed" >&2
exit 1
fi
if ((has_M)); then
:# do -M stuff
elif ((has_m)); then
:# do -m stuff
elif ((has_b)); then
:# do -b stuff
fi