3

Мне нужно проверить пользовательские опции в моем скрипте bash, но эти опции не всегда будут предоставляться при вызове скрипта. Например, возможные опции могут быть -dontbuild -donttest -dontupdate в любой комбинации, есть ли способ, чтобы я мог проверить их? Извините, если этот вопрос является базовым, я новичок в сценарии bash.

Спасибо

РЕДАКТИРОВАТЬ: я попробовал этот кусок кода, и вызвал сценарий с параметром -disableVenusBld, но он по-прежнему выводит "Начало сборки". Я делаю что-то неправильно? Заранее спасибо!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi

2 ответа2

5
for arg
do
    case "$arg" in
        -dontbuild)
            do_something
            ;;
        -donttest)
            do_something
            ;;
        -dontupdate)
            do_something
            ;;
        *)
            echo "Unknown argument"
            exit 1
            ;;
     esac
done

Где do_something представляет либо установку флага, либо фактическое выполнение чего-либо. Обратите внимание, что for arg неявно выполняется итерация по $@ (массив позиционных параметров) и эквивалентно явному for arg in $@ .

Также обратите внимание, что в Bash есть встроенная getopts но она использует только короткие опции (например, -x). Есть также внешняя утилита, называемая getopt которая принимает длинные опции, но имеет несколько недостатков и не рекомендуется.

options=":es:w:d:"

OLDOPTIND=$OPTIND
while getopts $options option
do
  case $option in
    e     ) do_something;;
    w     ) do_something $OPTARG;;
    d     ) foo=$OPTARG;;
    q     ) do_something;;
    s ) case $OPTARG in
                m | M ) bar="abc";;
                s | S ) baz="def";;
                *     ) echo "Invalid option for blah blah" 1>&2; exit;;
        esac;;
    *     ) echo "Unimplemented option chosen.";;   # DEFAULT
  esac
OLDOPTIND=$OPTIND
done
3

У Денниса была правильная идея, я хотел бы предложить несколько незначительных модов.

Доступ к аргументам сценариев оболочки осуществляется с помощью позиционных параметров $ 1, $ 2, $ 3 и т.д., А текущее число указывается в $ #. Классическая проверка для этого будет:

while [ $# -ne 0 ]
do
    ARG="$1"
    shift # get rid of $1, we saved in ARG already
    case "$ARG" in
    -dontbuild)
        DONTBUILD=1
        ;;
    -somethingwithaparam)
        SAVESOMEPARAM="$1"
        shift
        ;;
# ... continue
done

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .