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

Я хочу создать скрипт 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}" 

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

  • bashscript для нажатия клавиши со стрелкой вправо
  • Сценарий оболочки для проверки наличия одного или нескольких файлов с определенным расширением?
  • Хранение более длинного текстового вывода в памяти в переменных оболочки vs Запись на диск
  • Расширение имени файла для сценария ожидания в bash
  • команда status не распознает параметр `-p` в Ubuntu
  • echo wildcard globing
  • Больше сценариев оболочки, чем один в одном текстовом файле?
  • передать параметры скрипту bash, используя атрибуты шеф-повара
  • Проверьте зависимости bash / shell
  • Как узнать, как зарегистрировать полное имя скрипта, выполненное пользователем?
  • Почему команда jobs не работает в сценарии оболочки?
  • Interesting Posts

    Grep огромное количество шаблонов из огромного файла

    Добавить строку суффикса в конец каждой строки?

    Является ли команда stdout для терминала регистрируемой?

    (SOLVED) Как получить текущий рабочий каталог с инвертированной косой чертой?

    Какие порты необходимы и, как правило, должны быть разрешены в системе Linux?

    Какова соответствующая ценность vm.swappiness при использовании zram?

    Почему я не могу установить бит 64 Debian в виртуальной коробке

    Как использовать wifi с помощью hotspot без прокси-сервера?

    Ядро Linux: значение source-tree, in-tree и out-of-tree

    Как изменить кодовую фразу для прохода (менеджер паролей)

    Владелец файла NFS (uid) = 4294967294, не может многое сделать с моим монтированием, как это исправить?

    Несколько учетных данных пользователя в wget

    Почему переменные locale не отображаются на выходе env или printenv?

    Как я могу разрешить «дубликаты» в yum?

    Как предотвратить Make от случайного переопределения файлов?

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