Гетопт в оболочке

Я пишу сценарий оболочки для анализа параметров. Он правильно анализирует параметры, но когда я пропускаю входные аргументы, он не выходит из цикла while. Кто-нибудь может помочь в этом?

TEMP=`getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "$@"`

eval set -- "$TEMP"

while true; do

  case "$1" in

    -h)      print $USAGE
             exit 0 ;;
    -a)      case "$2" in
               -*|"") error "Option t, requires argument";
                      exit 1;;

               *)  print $2
                   T=${2^^} ; 
                   shift 2 ;;
             esac ;;

    -b)      case "$2" in
               -*|"") error "Option p, requires argument";
                   exit 1 ;;

               *)  print $2
                   PE=${2^^} ; 
                   shift 2 ;
             esac ;;

    -d)      case "$2" in
               -*|"") error "Option f, requires argument";
                      exit 1 ;;

               *)  print $2 ; 
                   IN=$2 ;
                   shift 2 ;;
             esac ;;

    -e)      case "$2" in
               ""|-*) error "Option e, requires argument";
                      exit 1 ;;

               *)  print  $2 ; 
                   KEY=$2 ;
                   shift 2 ;;
             esac ;;
    -c|--ca) case "$2" in
               ""|-*) error "Option c, requires argument"; 
                   exit 1;;

               *)  print $2 ;
                   C=${2};
                   shift 2 ;;
             esac ;;


   --)       shift ;
             break ;;

    *)       error "Invalid Input!" ;
             exit 1 ;;

  esac
done


USAGE:foo.sh -a arg1 -b arg2 -c arg3 -d arg 4 -e arg5

Это работает нормально но

foo.sh -a arg1 -b arg2 -c arg3

не выходит из цикла пока.

2 ответа

Решение

Вы никогда не выходите из цикла; как вы ожидаете выхода? Общая договоренность состоит в том, чтобы изучить $# на вершине, и только продолжить, если это zonzero.

Пока вы используете getopt вместо встроенного getoptsусловие цикла должно быть:

while [ $# -gt 0 ]
do
    case "$1" in
    ...
    esac
done

Вам также не нужна переменная $TEMP; Вы можете просто использовать:

eval set -- $(getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "$@")

Как правило, $(...) обозначения предпочтительнее обратных тиков.

Другие вопросы по тегам