我正在编写一个shell脚本来处理参数列表,我使用了getopt
。
但我发现它没有按预期工作。
我设法将这个问题缩小到这些界限:
case "$1" in
.....
--)
shift
break
;;
无论我提供什么参数(例如--)
或case
),我都可以看到./run -r -d
始终与./run
匹配。我不确定这是什么" --
"意味着或应该做什么
我搜索了很多,但没有一个结果解释了这个" --
"装置
我的shell脚本如下所示,我可以看到echo "in --)"
始终打印。我不确定这个in --)
OPTIONS=di:r:v
LONGOPTIONS=debug,inputdir:,random:,verbose
PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")
if [[ $? -ne 0 ]]; then
echo "I’m sorry, `getopt` failed in this environment."
exit 2
fi
eval set -- "$PARSED"
echo "$#"
while true; do
case "$1" in
-d|--debug)
d=y
shift
;;
-i|--inputdir)
inputFolder=y
folder="$2"
shift 2
;;
-v|--verbose)
v=y
shift
;;
-r|--random)
randNumFile="$2"
shift 2
;;
--)
echo "in --)" #this echo always prints
shift
break
;;
*)
echo "arguments error"
exit
;;
esac
done
echo "$#"
答案 0 :(得分:2)
此处man getopt
:
通常,在生成所有选项及其参数之前,不会生成非选项参数输出。那么' - '生成为单个参数,然后按照它们的顺序生成非选项参数,每个参数都作为单独的参数。
换句话说,getopt
会在所有选项后生成--
,因此您知道何时停止对它们进行循环。 --
之后的所有单词都应被视为非选项参数,即使它们以破折号开头。