Как получить доступ к нескольким опциям для флага командной строки в Bash - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу получить доступ к нескольким входам командной строки для флагов, но не могу заставить его работать. Порядок ввода вне моего контроля, с форматом (# являются числами, а не комментариями)

./program.sh -a -b # #
./program.sh -b # # -a
./program.sh -b # #
  • -a не имеет опций, это просто включение / выключение
  • -b всегда сопровождается двумя числами.

Я пытался использовать getopts, и это работает для -a и первого числа -b, но я не могу получить доступ ко второму номеру. Поскольку иногда -a следует после -b, обработка «остатка» ввода как строки не работает должным образом. Я попытался использовать цикл, который, когда он нашел -b, посмотрел на следующие два значения для установки, показанные ниже:

for i in "$@"; do 
    case "$i" in
        -a)
            upperCase=true;
            ;;
        -b)
            first=$(($i+1));
            second=$(($i+2));
            ;;
        *)
            ;;

    esac
done

выходные данные должны быть напечатаны буквами от # до # в обоих направлениях, но у меня это работает, моя единственная проблема - получение ввода.

1 Ответ

1 голос
/ 03 апреля 2019

Может быть, этот цикл будет работать вместо:

while [[ $# -gt 0 ]]
do
    case "$1" in
        -a)
            upperCase=true;
            ;;
        -b)
            first=$2;  # Take the next two arguments
            second=$3; 
            shift 2    # And shift twice to account for them
            ;;
        *)
            ;;

    esac
    shift  # Shift each argument out after processing them
done

$(($i+1)) просто добавляет единицу в переменную i вместо того, чтобы принимать следующий позиционный параметр, как вы хотели.

...