Требуется специальная проверка сценария оболочки

Я хочу создать скрипт bash, который будет иметь много вариантов во время выполнения.

# script.sh --dry-run --user <parameter1> --pass <parameter2> 

Я слышал о опции getopt, но похоже, что мы можем писать только --user or --password или --dry-run или --dry-run а не все из них. В принципе, я хочу использовать --user parameter1 как input1 и --pass parameter2 как input2, а специальный случай, если --dry-run опция --dry-run , а затем выполнять только код с сухим кодом вместо производства.

 #!/bin/bash user=$1 pass=$2 help() { cat<<EOF Usage : $0 --dry-run --user <user_id> --pass <password> you can specify --dry-run or --production EOF } [ ${3} ] || help function dry_run() { // --dry-run code } function production() { // --production code } 

Я хочу проверить --dry-run и если опция --dry-run , а затем выполнить функцию dry_run() else, выполните функцию production() . Но как писать варианты и проверки?

2 Solutions collect form web for “Требуется специальная проверка сценария оболочки”

Если я понял, что вам нужно, вы можете сделать это с помощью getopt :

 #!/bin/bash PARAMS=$(getopt -l dry-run,production,user:,pass: -n $0 "" -- "$@") if [ $? != 0 ]; then exit 1; fi eval set -- "$PARAMS" dryrun=false while [ -n "$1" ]; do case "$1" in --dry-run) dryrun=true; shift;; --production) dryrun=false; shift;; --user) user="$2"; shift 2;; --pass) pass="$2"; shift 2;; --) shift;; *) exit 1;; esac done if [ $dryrun = true ]; then ... else ... fi 

Вы можете добавить дополнительную обработку, если хотите запретить указывать как --dry-run и --production , или если --user и --user .

Вам действительно не нужно getopt для обработки сценариев long-options. Функция встроенных функций getopts может делать это (и обычно без подоболочек) . Фокус в том, чтобы использовать - как вариант. Таким образом, --dry-run (например) становится optvar=- и OPTARG=-dry-run . Вот пример того, как вы можете сделать это специально для этого случая:

 #!/bin/sh help(){ echo usage; } #dummy help unset user dryrun pass _o o #ensure all flag vars are unset while getopts :-:u:p:do && #getopts loop o=${o#-} _o=${o:+$OPTARG} #empty $o if $o==- do case $o$OPTARG in #test concatenated $o$OPTARG (u*|-user) user=${_o:-$2} ;; #set $user to $_o or $2 (p*|-pass) pass=${_o:-$2} ;; #ditto for $pass (d*|-dryrun) o=d dryrun=1 ;; #no $OPTARG either way - o=d base (*) ! help ;; #no usage options met - opt error esac || exit #quit with error if opt == ! help shift "$((!${#o}+(OPTIND-(OPTIND=1))))" #shift params as they're read done 

Это будет работать как есть. На самом деле я попробовал несколько вариантов с ним. Например:

 ~/getopts.sh -p-user --user me -uyou -d --dry-run 

… при запуске w / a #!/bin/sh -x bangline напечатал это на моем stderr:

 + unset user dryrun pass _o o + getopts :-:u:p:do + o=p _o=-user + pass=-user + shift 1 + getopts :-:u:p:do + o= _o= + user=me + shift 2 + getopts :-:u:p:do + o=u _o=you + user=you + shift 1 + getopts :-:u:p:do + o=d _o= + o=d dryrun=1 + shift 1 + getopts :-:u:p:do + o= _o= + o=d dryrun=1 + shift 1 + getopts :-:u:p:do 

После завершения цикла getopts вы можете просто сделать …

 [ "$((dryrun))" -eq 0 ] && production || dryrun 

… если вы объявили функции production() и dryrun() . Они найдут любые значения командной строки, заданные для $pass и / или $user назначенных по мере необходимости. Если любой из них не был объявлен в командной строке, вы можете рассмотреть их как:

 echo "${user=default_username}" "${pass=default_password}" 

… просто чтобы покрыть все ваши базы.

  • (test -n $ st)! = (test -z $ st) право?
  • Цитирование через unix-даты
  • Скрипт не ждет подпроцессов из цикла
  • Команда, которая генерирует как стандартную ошибку, так и вывод
  • оценка строки в csh
  • Как разбить строку - Bash
  • это скрипт, который запускается под текущей оболочкой или дочерней оболочкой?
  • Обрезать последние символы из строки
  • В Bash, если и если то же самое?
  • дифференцируя два файла и получая уникальный результат в третьем
  • команда bash / script для сброса маршрута по умолчанию
  • Interesting Posts

    «Выполнение транзакции (блокировка завершена)« насколько «заблокировано» отключено?

    Подключение через SSHFS в файловой системе NFS

    Убивание вторичного диспетчера диспетчера сортировки Xorg

    Как загрузить систему с полным дисковым шифрованием из GRUB rescue

    Как комментировать snmpmibd и snmpd в rc.tcpip в AIX с помощью sed?

    Машиночитаемое количество обновлений? Альтернатива / usr / lib / update-notifier / apt-check?

    Шаблоны для сценария запуска?

    Почему установка по умолчанию Linux запускает больше процессов, чем стандартная установка OpenBSD?

    Нет KDE: как использовать strigi для индексации моих файлов?

    Какой дистрибутив Linux лучше всего подходит для мультимедиа и игр?

    echo *, не может узнать, что он делает

    Как объединить данные из многих файлов в один файл?

    Может ли прокрутка колесика мыши работать в сеансе экрана?

    Могу ли я изменить владельца туннеля после его создания?

    Как установить удаленный общедоступный X-сервер без ущерба для его работы?

    Linux и Unix - лучшая ОС в мире.