如果我在getopt中有很多变量,我怎么能最小化我的代码

时间:2014-09-03 10:53:54

标签: shell getopts

实际上我想最小化我的代码,因为如果我有很多来自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"

更新:如果有像帮助这样的选项,那么我该如何处理

2 个答案:

答案 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