Как передать в сценариях оболочки обязательные и необязательные флаги в командной строке с помощью getopts?

Я хочу передать 3 параметра с помощью getopts в мой сценарий оболочки. Скрипт требует как минимум первых 2, третий параметр необязателен. Если он не установлен, используется значение по умолчанию. Так что следующее будет работать:

sh script.sh -a "/home/dir" -b 3
sh script.sh -a "/home/dir" -b 3 -c "String"

Я пытался сделать это следующим образом, но он постоянно игнорирует введенные мной параметры.

usage() {
 echo "Usage: Script -a <homedir> -b <threads> -c <string>"
  echo "options:"
                echo "-h      show brief help"

  1>&2; exit 1;
}

string="bla"

while getopts h?d:t:a: args; do
case $args in
    -h|\?)
        usage;
        exit;;
    -a ) homedir=d;;
    -b ) threads=${OPTARG};;
    -c ) string=${OPTARG}
        ((string=="bla" || string=="blubb")) || usage;;
    : )
        echo "Missing option argument for -$OPTARG" >&2; exit 1;;
    *  )
        echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
  esac
done

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

Я действительно хотел бы получить вашу помощь здесь. Спасибо:)


person Momina    schedule 29.08.2016    source источник
comment
Вы смотрели на значение $args внутри цикла while? В руководстве по getops есть полезная информация; может быть, вы должны сначала проверить там.   -  person larsks    schedule 29.08.2016


Ответы (1)


У вас несколько ошибок в сценарии. Самое главное, $args содержит только букву опции без начального дефиса. Кроме того, строка параметров, которую вы дали для getopts (h?d:t:a:), не соответствует параметрам, которые вы фактически обрабатываете (h, ?, a, b, c). Вот исправленная версия цикла:

while getopts "h?c:b:a:" args; do
case $args in
    h|\?)
        usage;
        exit;;
    a ) homedir=d;;
    b ) threads=${OPTARG};;
    c ) string=${OPTARG}
        echo "Entered string: $string"
        [[ $string=="bla" || $string=="blubb" ]] && usage;;
    : )
        echo "Missing option argument for -$OPTARG" >&2; exit 1;;
    *  )
        echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
  esac
done
person Georg P.    schedule 29.08.2016
comment
Спасибо большое - person Momina; 29.08.2016
comment
Вы можете отметить ответ как правильный, если он решил вашу проблему. - person Georg P.; 01.09.2016