/bin/sh:使用 getopt 解析长选项,形式为 --parameter='value'
/bin/sh: parse long options using getopt, in the form --parameter='value'
我有以下代码片段来解析 /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 "[=13=]" -- "$@")
if [ $? != 0 ] ; then
printf "\n3[1;31m Error:3[0m Failed to parse options...exiting.\n\n"
exit 1
fi
eval set -- "$OPTS"
unset OPTS
# extract options and their arguments into variables.
while true ; do
case "" in
--exclude )
EXCLUDE="y"
shift
;;
-n | --dry-run )
DRYRUN="y"
shift
;;
-- )
shift
break
;;
*)
printf "\n3[1;31m Error:3[0m Invalid option: 3[1;31m-$OPTARG3[0m\n\n"
exit 1
;;
esac
done
echo $\@ = $@
我需要更改什么才能使用 --exclude='foo'
?
您需要通过在名称后附加 :
来指定 --exclude
可以接受参数。
OPTS=$(getopt --options 'n' --long 'exclude:,dry-run' --name "[=10=]" -- "$@")
来自手册页:
-l, --longoptions longopts
The long (multi-character) options to be recognized. More
than one option name may be specified at once, by
separating the names with commas. This option may be
given more than once, the longopts are cumulative. Each
long option name in longopts may be followed by one colon
to indicate it has a required argument, and by two colons
to indicate it has an optional argument.
我有以下代码片段来解析 /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 "[=13=]" -- "$@")
if [ $? != 0 ] ; then
printf "\n3[1;31m Error:3[0m Failed to parse options...exiting.\n\n"
exit 1
fi
eval set -- "$OPTS"
unset OPTS
# extract options and their arguments into variables.
while true ; do
case "" in
--exclude )
EXCLUDE="y"
shift
;;
-n | --dry-run )
DRYRUN="y"
shift
;;
-- )
shift
break
;;
*)
printf "\n3[1;31m Error:3[0m Invalid option: 3[1;31m-$OPTARG3[0m\n\n"
exit 1
;;
esac
done
echo $\@ = $@
我需要更改什么才能使用 --exclude='foo'
?
您需要通过在名称后附加 :
来指定 --exclude
可以接受参数。
OPTS=$(getopt --options 'n' --long 'exclude:,dry-run' --name "[=10=]" -- "$@")
来自手册页:
-l, --longoptions longopts
The long (multi-character) options to be recognized. More than one option name may be specified at once, by separating the names with commas. This option may be given more than once, the longopts are cumulative. Each long option name in longopts may be followed by one colon to indicate it has a required argument, and by two colons to indicate it has an optional argument.