Несколько параметров для сценария 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 
  • Поверните экран с помощью xrandr на Solaris 10
  • Как удалить все файлы, кроме одного в Unix?
  • Как я могу перейти на предыдущий каталог вместо того, чтобы идти вверх?
  • Какие команды я могу использовать для сброса и очистки терминала?
  • Установите удаленный каталог UNIX в Windows 7
  • Выполнение локального скрипта / команды на удаленном сервере
  • Терминал Vs. Shell
  • Есть ли способ сделать bash более дружественным к TAB?
  • Странные изменения прав при сохранении файла в разделе Samba из редактора Windows
  • Как запустить vim без выполнения / etc / vimrc?
  • Как tar.gz все под xx MB?
  • Как интерпретировать результаты команды `ls -l`?
  • Давайте будем гением компьютера.