实际上我想最小化我的代码,因为如果我有很多来自getopt的变量,如20-30变量那么代码变得非常长
usage(){ echo "usage" }
ARGS=$(getopt -o : --long "message:,name:,help" -- "$@");
eval set -- "$ARGS";
while true; do
case "$1" in
--help)
shift;
usage
exit 0;
;;
--message)
shift;
if [ -n "$1" ]; then
message="$1"
shift;
fi
;;
--name)
shift;
if [ -n "$1" ]; then
name="$1"
shift;
fi
;;
--)
shift;
break;
;;
esac
done
if [ -z "$message" ]; then
echo 'message cannot be empty'
exit 1
fi
if [ -z "$name" ]; then
echo 'default name:default'
name=default
fi
echo name:"$name"
更新:如果有像帮助这样的选项,那么我该如何处理
答案 0 :(得分:1)
第一步是数组:
key_value_options=(message name)
然后你将它们用来创建getopt
字符串:
getopt_options="$(printf %s:, "${key_value_options[@]}")"
对于case
语句,您可以使用管道加入选项:
case_options="$(IFS='|' && echo "${key_value_options[*]}")"
答案 1 :(得分:1)
充实l0b0的回答
declare -A values
key_value_options=(message name foo bar baz)
getopt_options="$(printf %s:, "${key_value_options[@]}")"
eval set -- "$(getopt -o : --long "$getopt_options" -- "$@")"
while true; do
var=${1#--} # strip the leading hyphens
shift
[[ -z $var ]] && break
values[$var]=$1
shift
done
if [[ -z ${values[message]} ]]; then
echo 'message cannot be empty'
exit 1
fi
# shorthand for setting a default value
: ${values[name]:=default}
for var in "${!values[@]}"; do
printf "%s:%s\n" $var "${values[$var]}"
done
行动中
$ bash test.sh
message cannot be empty
$ bash test.sh --message foo
name:default
message:foo
$ bash test.sh --message foo --foo qux
name:default
foo:qux
message:foo
$ bash test.sh --message foo --foo qux --name name --unknown option
name:name
foo:qux
message:foo