我试图将getopts用于bash脚本。此脚本可以有标志,所有这些标志都是必需的,需要包含一个值。当其中一个应该包含值的强制标志为空时,getopts使用next-in-line标志作为其内容。我该如何防止这种情况?
这是我的例子:
#!/bin/bash
while getopts "A:B:" OPTION
do
case $OPTION in
A)
GILIA="$GILIA $OPTARG"
echo GILIA $GILIA
;;
B)
GILIB="$GILIB $OPTARG"
echo GILIB $GILIB
;;
esac
done
使用带有值的两个标志时:
./test_opt2 -A aaa -B bbb
GILIA aaa
GILIB bbb
使用" -A"国旗空:
./test_opt2 -A -B bbb
GILIA -B
我知道这是getopts的正常/典型行为,我确信有办法解决这个问题...
有什么想法吗?
答案 0 :(得分:3)
您可以做的是检查$ OPTARG的值。如果它以-
开头,则减小索引$ OPTIND的值,以便下次循环时选择-
参数作为OPTION。
在第二个示例中,处理空-A参数时,$ OPTIND将设置为3.我的代码会将值设置回2,以便下一步处理-B
。
case $OPTION in
A)
arg=${OPTARG#-}
if [ $arg == $OPTARG ]
then
GILIA="$GILIA $OPTARG"
echo GILIA $GILIA
else
echo "-A needs argument"
OPTIND=$OPTIND-1
fi
;;
答案 1 :(得分:2)
如果您想将空白参数传递给-A
,那么:
./test_opt2 -A '' -B bbb
如果您希望脚本在没有参数的情况下接受-A
,请更改脚本:
while getopts "AB:" OPTION
然后脚本会期望-A永远不会参与。
答案 2 :(得分:2)
假设:(1)所有选项都是必需的,(2)任何参数都不能以' - '开头。然后我会用这样的东西:
while getopts ":a:b:" opt ; do
[[ ${OPTARG} == -* ]] && { echo "Missing argument for -${opt}" ; exit 1 ; }
case ${opt} in
a ) gilia="$gilia $OPTARG"
echo gilia $gilia
;;
b ) gilib="$gilib $OPTARG"
echo gilib $gilib
;;
\?) echo "Invalid (-${OPTARG}) option"
;;
: ) echo "Missing argument for -${OPTARG}"
;;
esac
done
你会得到:
$ ./t.sh -a aaa -b bbb
gilia aaa
gilib bbb
$ ./t.sh -a -b bbb
Missing argument for -a
$ ./t.sh -a aaa -b
gilia aaa
Missing argument for -b
$ ./t.sh -a aaa -b bbb -c ccc
gilia aaa
gilib bbb
Invalid (-c) option