这是我的bash案例test-getopt.sh
,用于了解bash中的getopt。
OPTS=$(getopt -o d:eh -- "$@")
eval set -- "$OPTS"
while true; do
case "$1" in
-d )
if [[ $2 == "a" ]];then
echo "i am -d's arg :a"
elif [[ $2 == "b" ]];then
echo "i am -d's arg :b"
fi
shift;;
-e )
echo "i am e"
shift;;
-h)
echo "help you"
shift;;
-- )
shift;;
*)
break;;
esac
done
要调用option及其参数,一次调用一个option及其参数。
bash test-get.sh -d a
i am -d's arg :a
其他论点。
bash test-get.sh -d b
i am -d's arg :b
我想调用option,并且所有参数都在一个命令中
bash test-get.sh -d a -d b
i am -d's arg :a
有没有办法获得以下预期输出?
bash test-get.sh -d a -d b
i am -d's arg :a
i am -d's arg :b
答案 0 :(得分:1)
基本问题是,当处理带有参数的选项时,您需要两次shift
才能从arg列表中同时删除选项及其参数。像这样:
OPTS=$(getopt -o d:eh -- "$@")
eval set -- "$OPTS"
while true; do
case "$1" in
-d )
if [[ $2 == "a" ]];then
echo "i am -d's arg :a"
elif [[ $2 == "b" ]];then
echo "i am -d's arg :b"
fi
shift 2;; # <-- The "2" here is the only change
-e )
echo "i am e"
shift;;
-h)
echo "help you"
shift;;
-- )
shift;;
*)
break;;
esac
done
在没有两次移位的情况下,发生的情况是,在循环中的第一次arg列表是“ -d”“ a”“-d”“ b”“-”。您检测到“ -d”和“ a”,正确打印,然后移动,这使arg列表保留为“ a”,“-d”,“ b”,“-”。在循环的第二次,它无法匹配“ a”作为选项,执行*)
情况,并退出处理循环。