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

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

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

  • Программа сценария оболочки Bash, которая запрашивает и читает два целых числа от пользователя.
  • Как называется переменная окружения (?) С текущей шириной терминала?
  • Правильный способ добавления учетной записи пользователя через скрипт bash
  • Как я могу использовать arptables для ограничения количества исходящих запросов ARP в секунду?
  • Поиск совпадающих файлов с подстановочными знаками без использования find в сценарии bash
  • Как предотвратить завершение сценария при выходе из оболочки?
  • Как получить возвращаемое значение из функции MATLAB
  • Сравните два числа, считанные из файла
  • Как создать diff для серии файлов?
  • Эпиляция языка сценариев
  • Сценарий Bash, который автоматически убивает процессы, когда загрузка процессора / памяти становится слишком высокой
  • Linux и Unix - лучшая ОС в мире.