2016-02-24 4 views
1

Так что мой Getopt код выглядит следующим образом:getopt не поддерживает пробелы между опциями в Bash?

ARG_H=0 
    ARG_V=0 
    ARG_A=0 
    ARG_N=5 

    TEMP=`getopt -o hvn:a -n "vdu" -- "$1"` 
    eval set -- "$TEMP" 
    while true ; do 
      case "$1" in 
        -h|--argh) ARG_H=1 ; shift ;; 
        -v|--argv) ARG_V=1 ; shift ;; 
        -n|--argn) 
          case "$2" in 
          "") shift 2 ;; 
          *) ARG_N=$2 ; shift 2 ;; 
          esac ;; 
        -a|--arga) ARG_A=1 ; shift ;; 
        --) shift ; break ;; 
        *) echo "error" ; exit 1 ;; 
      esac 
    done 
    echo "$ARG_H" 
    echo "$ARG_V" 
    echo "$ARG_N" 
    echo "$ARG_A" 

Но по какой-то причине, она работает только тогда, когда моя командная строка выглядит следующим образом:

./vdu -a-v-n15 

или

./vdu -avn15 

но если I введите

./vdu -a -v -n 15 

он зарегистрирует только первый флаг. Почему это? Этот код, похоже, идентичен учебным пособиям getopts, на которые я смотрел.

ответ

1
TEMP=`getopt -o hvn:a -n "vdu" -- "$1"` 

$1 - это только первый аргумент в вашей программе. Используйте [email protected], чтобы передать все аргументы.

TEMP=`getopt -o hvn:a -n "vdu" -- "[email protected]"` 

Другие мысли:

  • традиционно проходить $0 к -n, а не жестко прописывать название программы.
  • Вы можете пропустить временную переменную, если вы объедините eval set с вызовом getopt.
  • Считается, что хороший стиль использования $(...) вместо `...`. $(...) может быть вложен более легко.

Результат:

eval set -- "$(getopt -o hvn:a -n "$0" -- "[email protected]")" 
+0

Ах, спасибо очень много. Я думал, так как я делал это внутри функции, мне пришлось передать $ @ in в качестве аргумента и использовать $! в команде getopt, что, по-видимому, не так. –