LINUX.ORG.RU

Получение аргументов shell-скрипта


0

0

Допустим я запускаю shell-скрипт:

./script.sh -a 45 -b egfe

И мне надо получить его аргументы (45 и egfe), я знаб, что надо юзать $1, $2. ... я знаю, что еси аргументов больше 10, надо юзать shift, по привычке (язык си) приходит идея реализовать получение аргументов так:

for ARG in $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
do
     case ARG in
     "-a")
          shift
          ARGA=$ARG
          ;;
     "-b")
          shift
          ARGB=$ARG
          ;;
     *)
          usage
          ;;
     esac
done

Но фишка в том, что ARG уже получил свое значение, поэтому shift его не изменит, а как же тогда получить по-норамальному аргументы? В этом форуме вроде люди умные, расскажите плиз, как вы это делаете?
anonymous

> ... я знаю, что еси аргументов больше 10, надо юзать shift

Зачем? Это в ДОСе так было.

А, вообще, man getopt

Die-Hard ★★★★★
()

#!/bin/bash
while [ $# != "0" ]
do 
     case $1 in
     "-a")
          echo "option  -a"
	  echo "argument $2"
	  shift
          ;;
     "-b")
          echo "option  -b"
	  echo "argument $2"
	  shift
          ;;
     *)
          echo "Unknown option  $1"
          ;;
     esac
     shift
done

sS ★★★★★
()
Ответ на: комментарий от sS

А я вот как попробовал как-то генерализовать:
#!/bin/bash
for arg; do
        case $arg in
                -a*)
                        opt_a=${arg##-a}
                        [ -z "$opt_a" ] && needvar="opt_a"
                        ;;
                -b*)
                        opt_b=${arg##-b}
                        [ -z "$opt_b" ] && needvar="opt_b"
                        ;;
                -c)
                        opt_c=1
                        ;;
                *)
                        [ -z "$needvar" ] && break
                        eval $needvar=$arg
                        needvar=
                        ;;
        esac
        shift
done

Теперь можно звать как ./foo.sh -a13 -b 10 (т.е. арг давать либо 
слитно, либо отдельно). В реальности конечно лучше getopt, чтобы 
никого не удивлять, но в зависимости от требований может и такое 
прохлять :)

rihad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.