Назад | Перейти на главную страницу

Bash getopts: разрешить, но не требовать аргумент

Я пишу bash-скрипт, разбирая параметры с помощью getopts, например:

    #!/bin/bash

    while getopts ab: ; do
        case $opt in
          a) AOPT=1
             ;;
          b) BOPT=$OPTARG
             ;;
        esac
    done

Я бы хотел, чтобы опция "-b" ОБЯЗАТЕЛЬНО принимала аргумент, но пока что getopts жалуется, если аргумент не передан. Как я могу этого добиться?

Спасибо!

Вы можете запускать getopts в автоматическом режиме, включив двоеточие в качестве первого символа optstring. Это можно использовать для подавления сообщения об ошибке.

Из справочной страницы getopts:

If the first character of optstring is a colon, the  shell  variable specified  
by name shall be set to the colon character and the shell variable OPTARG shall 
be set to the option character found.

Таким образом, у вас может сработать что-то вроде следующего:

#!/bin/bash

AOPT="unassigned"
BOPT="unassigned"

while getopts :ab: opt ; do
  case $opt in
    a) AOPT=1
       ;;
    b) BOPT=$OPTARG
       ;;
    :) BOPT=
       ;;
  esac
done

echo "AOPT = $AOPT"
echo "BOPT = $BOPT"

Некоторые примеры:

rlduffy@hickory:~/test/getopts$ ./testgetopts -a -b Hello
AOPT = 1
BOPT = Hello
rlduffy@hickory:~/test/getopts$ ./testgetopts -b goodbye
AOPT = unassigned
BOPT = goodbye
rlduffy@hickory:~/test/getopts$ ./testgetopts -a -b
AOPT = 1
BOPT =