Разбор опций, которые принимают аргументы в getopts

У меня есть следующая программа foo, которая может принимать один из трех необязательных флагов: f, g или s:

usage()
{
    echo "Use this correctly"
}

while getopts "fgs" opt; do
    case $opt in
        f)
          echo f
          foo="$OPTARG"
          echo $foo
          ;;  
        g) 
          echo g 
          foo="g"
          ;;  
        s)  
          echo s
          foo="s"
          ;;  
    esac
done

if [ -z "$foo" ]
then
   usage
   exit
fi

echo $foo
exit

Когда я делаю foo -g или foo -s, я получаю ожидаемые результаты:

g
g

и

s
s

соответственно. Но когда я делаю foo -f bar, я ожидаю

f
bar
bar

но получить

f
Use this correctly

указывает на то, что $foo не устанавливается должным образом в случае -f. Что я делаю не так?


person Mike S    schedule 11.07.2018    source источник


Ответы (1)


Вы должны заменить

while getopts "fgs" opt; do

с

while getopts "f:gs" opt; do

Опции, которые принимают аргумент, должны сопровождаться двоеточием. Только для этих опций getopts задает переменную OPTARG.

person hnicke    schedule 11.07.2018