我有以下片段来解析/bin/dash
中的短选项和长选项。
选项-n|--dry-run
不接受任何参数。但是--exclude
应该采用--exclude='foo'
形式的字符串。更为复杂的是,--exclude
没有做空的选择。
以下代码在我使用script.sh --exclude
时有效,但在使用script.sh --exclude='foo'
时,我会得到一个错误:
option '--exclude' doesn't allow an argument
这是我的代码:
#!/bin/sh
OPTS=$(getopt --options 'n' --long 'exclude,dry-run' --name "$0" -- "$@")
if [ $? != 0 ] ; then
printf "n 33[1;31m Error: 33[0m Failed to parse options...exiting.nn"
exit 1
fi
eval set -- "$OPTS"
unset OPTS
# extract options and their arguments into variables.
while true ; do
case "$1" in
--exclude )
EXCLUDE="y"
shift
;;
-n | --dry-run )
DRYRUN="y"
shift
;;
-- )
shift
break
;;
*)
printf "n 33[1;31m Error: 33[0m Invalid option: 33[1;31m-$OPTARG 33[0mnn"
exit 1
;;
esac
done
echo $@ = $@
我必须更改什么才能使用--exclude='foo'
?
您需要指定--exclude
可以通过在名称后附加:
来接受参数。
OPTS=$(getopt --options 'n' --long 'exclude:,dry-run' --name "$0" -- "$@")
来自手册页:
-l,--longoptionslongopts
要识别的长(多字符(选项。更多一次可以指定多个选项名称用逗号分隔名称。此选项可能是给定一次以上,longopts是累积的每个longopts中的长选项名称后面可以跟一个冒号表示它有一个必需的参数,和两个冒号以指示它具有可选参数。