Использование getopts в bash для получения необязательного входного аргумента

Я использую getopts для обработки входных аргументов. У меня проблема с чтением значения необязательного аргумента.
Когда я запускаю скрипт с аргументами test.sh -t test -r server -p password -v 1
, $OPTARG не возвращает значение необязательного аргумента -v.

Может ли кто-нибудь сообщить мне, как обработать необязательное значение аргумента?

#!/bin/bash

usage() 
{
cat << EOF
usage: $0 options

OPTIONS:
   -h      Show this message
   -t      Test type
   -r      Server address
   -p      Server root password
   -v      Verbose
EOF
}

TEST=
SERVER=
PASSWD=
VERBOSE=

echo "======111======"
while getopts "ht:r:p:v" OPTION
do
     case $OPTION in
         h)
             usage
             echo "===Option h selected=="
             exit 1
             ;;
         t)
             TEST=$OPTARG
             echo "====option t selected===$TEST"
             ;;
         r)
             SERVER=$OPTARG
             echo "=====option r selected==="
             ;;
         p)
             PASSWD=$OPTARG
             echo "====option p selected==="
             ;;
         v)
             VERBOSE=$OPTARG
             echo "======option v selected===$VERBOSE"
             ;;
         ?)
             echo "====unknown option selected===="
             usage
             exit
             ;;
     esac
done

echo "========222===="

person Tech Tech    schedule 29.05.2014    source источник
comment
Я полагаю, что вам не хватает двоеточия : после v в вызове getopts. Должно быть while getopts "ht:r:p:v:".   -  person savanto    schedule 30.05.2014
comment
В качестве альтернативы вы можете просто написать что-то вроде ((VERBOSE++)) и вообще избежать аргумента.   -  person jaap    schedule 30.05.2014


Ответы (1)


  1. Сделайте то, что указано в описании дела.

    case $OPTION in
      v)
        VERBOSE=$OPTARG
        do_the_thing $OPTARG
        ;;
    esac
    
  2. Делайте то, что следует за оператором case.

    if [ ! -z "$VERBOSE" ]; then
      do_the_thing "$VERBOSE"
    else
      do_not_do_the_thing
    fi
    
person Sammitch    schedule 29.05.2014