Подтвердить что ты не робот

Bash getopts с несколькими и обязательными параметрами

Можно ли использовать getopts для обработки нескольких параметров вместе? Например, myscript -iR или myscript -irv.

Кроме того, у меня есть ситуация, когда на основе условия script потребуется обязательная опция. Например, если аргумент script является каталогом, мне нужно указать параметр -R или -r вместе с любыми другими параметрами (myscript -iR mydir или myscript -ir mydir или myscript -i -r mydir или myscript -i -R mydir), в случае файла только -i достаточно (myscript -i myfile).

Я попытался выполнить поиск, но не получил никаких ответов.

4b9b3361

Ответ 1

Вы можете объединить параметры, которые вы предоставляете, и getopts будет их разделять. В инструкции case вы будете обрабатывать каждый вариант отдельно.

Вы можете установить флаг при просмотре параметров и проверить, чтобы после завершения цикла getopts присутствовали обязательные "параметры" (!).

Вот пример:

#!/bin/bash
rflag=false
small_r=false
big_r=false

usage () { echo "How to use"; }

options=':ij:rRvh'
while getopts $options option
do
    case $option in
        i  ) i_func;;
        j  ) j_arg=$OPTARG;;
        r  ) rflag=true; small_r=true;;
        R  ) rflag=true; big_r=true;;
        v  ) v_func; other_func;;
        h  ) usage; exit;;
        \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
        :  ) echo "Missing option argument for -$OPTARG" >&2; exit 1;;
        *  ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
    esac
done

shift $(($OPTIND - 1))

if ! $rflag && [[ -d $1 ]]
then
    echo "-r or -R must be included when a directory is specified" >&2
    exit 1
fi

Это представляет собой полную ссылочную реализацию функции getopts, но это всего лишь эскиз более крупного script.