Несколько параметров для сценария bash

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

благодаря

EDIT: Я попробовал этот фрагмент кода и назвал скрипт с параметром -disableVenusBld, но он все еще печатает «Starting build». Я делаю что-то неправильно? Заранее спасибо!

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 Solutions collect form web for “Несколько параметров для сценария bash”

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

Доступ к сценариям оболочки можно получить с помощью позиционных параметров $ 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, вам лучше использовать это.

 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 
  • Как интерпретировать SMART-атрибуты?
  • Как я могу запустить другую команду, но с теми же аргументами?
  • Какую команду мне нужно использовать для удаления файла с именем `-rf`?
  • Различия и выполнение `set` &` env`?
  • Как я могу инициировать уведомление, когда заканчивается работа / процесс?
  • Как интерпретировать результаты команды `ls -l`?
  • Когда rm удаляет открытые файлы?
  • Unix: Есть ли способ «скопировать» разрешения файлов или каталогов?
  • Как запускать команды Unix из Vim?
  • Как сохранить псевдоним Unix?
  • Как сделать разрешение на новый файл наследованием из родительского каталога?
  • Как я могу найти историю bash и повторить команду?
  • Interesting Posts
    Давайте будем гением компьютера.