2014-09-03 4 views
2

на самом деле я хотел, чтобы минимизировать свой код, becauze, если у меня есть много переменных из Getopt как 20- 30 переменных, то код становится очень и очень долгокак я могу уменьшить мой код, если у меня есть много переменных в Getopt

usage(){ echo "usage" } 
    ARGS=$(getopt -o : --long "message:,name:,help" -- "[email protected]"); 
    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" 

Обновлено: если есть возможность, как помощь, то как я могу справиться с этим

ответ

1

Первым шагом будет массив:

key_value_options=(message name) 

Тогда вы munge их, чтобы создать getopt StrI нг:

getopt_options="$(printf %s:, "${key_value_options[@]}")" 

Для case заявления вы присоединитесь варианты с трубой вместо:

case_options="$(IFS='|' && echo "${key_value_options[*]}")" 
+0

спасибо для ответа – Terence

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" -- "[email protected]")" 
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 
+0

Я не использовал оператор case: 'getopt' удалит недопустимые параметры. –

+0

спасибо, что это сработало для меня – Terence

+0

Вам не нужно «объявлять» массив, и вы должны использовать '-a' -' -A' объявляет * ассоциативный * массив. – l0b0