Bash-də command line argümanlarını necə analiz etmək olar?

Bu xəttdən istifadə edilən bir skript var deyək:

 ./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile 

və ya bu:

 ./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile 

Bu sintaksis analizində nə qəbul edilir, belə ki hər halda (və ya ikisinin birləşməsi) $v , $f$d bütün true$outFile /fizz/someOtherFile bərabər olacaq?

1488
10 окт. Lawrence Johnston 10 oktyabr təyin etdi 2008-10-10 19:57 '08 at 7:57 pm 2008-10-10 19:57
@ 30 cavab

Metod # 1: getopt [s] olmadan bash istifadə

Dəyərlər bir əsas dəyər cütünə keçmək üçün iki ümumi yol:

Bash Space -s bağlıdır (məsələn, - --option argument ) (getopt [s] olmadan)

./myscript.sh -e conf -s/etc -l/usr/lib/etc/hosts

 #!/bin/bash POSITIONAL=() while [[ $# -gt 0 ]] do key="$1" case $key in -e|--extension) EXTENSION="$2" shift # past argument shift # past value ;; -s|--searchpath) SEARCHPATH="$2" shift # past argument shift # past value ;; -l|--lib) LIBPATH="$2" shift # past argument shift # past value ;; --default) DEFAULT=YES shift # past argument ;; *) # unknown option POSITIONAL+=("$1") # save it in an array for later shift # past argument ;; esac done set -- "${POSITIONAL[@]}" # restore positional parameters echo FILE EXTENSION = "${EXTENSION}" echo SEARCH PATH = "${SEARCHPATH}" echo LIBRARY PATH = "${LIBPATH}" echo DEFAULT = "${DEFAULT}" echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"\'\"*\"\'} # If equals delimited named parameter if [[ "$1" =~ ^..*=..* ]]; then # Add to named parameters array echo "ARGN+=('$_escaped');" # key is part before first = local _key=$(echo "$1" | cut -d = -f 1) # val is everything after key and = (protect from param==value error) local _val="${1/$_key=}" # remove dashes from key name _key=${_key//\-} # skip when key is empty if [[ "$_key" == "" ]]; then shift continue fi # search for existing parameter name if (echo "$existing_named" | grep "\b$_key\b" >/dev/null); then # if name already exists then it a multi-value named parameter # re-declare it as an array if needed if ! (declare -p _key 2> /dev/null | grep -q 'declare \-a'); then echo "$_key=(\"\$$_key\");" fi # append new value echo "$_key+=('$_val');" else # single-value named parameter echo "local $_key=\"$_val\";" existing_named=" $_key" fi # If standalone named parameter elif [[ "$1" =~ ^\-. ]]; then # remove dashes local _key=${1//\-} # skip when key is empty if [[ "$_key" == "" ]]; then shift continue fi # Add to options array echo "ARGO+=('$_escaped');" echo "local $_key=\"$_key\";" # non-named parameter else # Escape asterisk to prevent bash asterisk expansion _escaped=${1/\*/\'\"*\"\'} echo "ARGV+=('$_escaped');" fi shift done } #--------------------------- DEMO OF THE USAGE ------------------------------- show_use () { eval $(parse_params "$@") # -- echo "${ARGV[0]}" # print first unnamed param echo "${ARGV[1]}" # print second unnamed param echo "${ARGN[0]}" # print first named param echo "${ARG0[0]}" # print first option param (--force) echo "$anyparam" # print --anyparam value echo "$k" # print k=5 value echo "${multivalue[0]}" # print first value of multi-value echo "${multivalue[1]}" # print second value of multi-value [[ "$force" == "force" ]]  echo "\$force is set so let the force be with you" } show_use "param 1" --anyparam="my value" param2 k=5 --force --multi-value=test1 --multi-value=test2 
8
01 июля '16 в 23:56 2016-07-01 23:56 Cavab Oleksii Chekulaievə 01 iyul '16 saat 23:56 2016-07-01 23:56 tarixində verilir

EasyOptions ayrıştırma tələb etmir:

 ## Options: ## --verbose, -v Verbose mode ## --output=FILE Output filename source easyoptions || exit if test -n "${verbose}"; then echo "output file is ${output}" echo "${arguments[@]}" fi 
7
04 июля '16 в 19:47 2016-07-04 19:47 Cavab Renato Silva tərəfindən 04 iyul '09 19:47 2016-07-04 19:47 'də verilir

Getopts'ları bir yerdə üstündə bir yerdə daha yüksək səviyyədə pozmamaq üçün bir funksiyanı necə edim?

 function waitForWeb () { local OPTIND=1 OPTARG OPTION local host=localhost port=8080 proto=http while getopts "h:p:r:" OPTION; do case "$OPTION" in h) host="$OPTARG" ;; p) port="$OPTARG" ;; r) proto="$OPTARG" ;; esac done ... } 
6
19 июля '13 в 10:50 2013-07-19 10:50 cavab 19 iyul 'da saat 10:50' da akostadinov tərəfindən verilir 2013-07-19 10:50

getopt(1) AT T-dən qısa bir canlı səhv olduğunu unutmayın.

Getopt 1984-cü ildə yaradıldı, ancaq 1986-cı ildə dəfn edildi, çünki bu, həqiqətən faydalı deyildi.

getopt çox köhnəlmiş olduğunu sübut edir ki, man page getopt(1) hələ də "$*" əvəzinə "$@" getopts(1) və 1986-cı ildə "Bourne Shell" getopts(1) shell getopts(1) daxilində boşluqlarla arqumentləri idarə etmək üçün quraşdırılmışdır.

BTW: Əgər uzun müddətli parametrlərin cədvəl skriptlərindən getopt(3) , lipc (Solaris) və ksh93 dən getopt ( getopt(3) tətbiqinin uzun variantları qısa variantlar üçün alias kimi uzun parametrləri dəstəkləyən bir uzun variant tətbiqini tətbiq etdiyini bilmək maraqlı ola bilər. Bu, ksh93Bourne Shell getopts vasitəsilə uzun variantlar üçün bir interfeys tətbiq Bourne Shell səbəb olur.

Bourne Shell əl səhifəsindən götürülmüş uzun parametrlərə nümunə:

getopts "f:(file)(input-file)o:(output-file)" OPTX "$@"

həm Bourne Shell, həm də ksh93-də alternativ taxmaların necə istifadə olacağını göstərir.

Born-in son kabuk istinad səhifəsinə baxın:

http://schillix.sourceforge.net/man/man1/bosh.1.html

və getopt üçün istinad page (3) OpenSolaris:

http://schillix.sourceforge.net/man/man3c/getopt.3c.html

və nəhayət, getopt (1) köhnəlmiş $ * yoxlanılması üçün man səhifəsi:

http://schillix.sourceforge.net/man/man1/getopt.1.html

4
19 окт. Cavab 19 oktyabr cəfəngiyatdır . 2015-10-19 16:59 '15 at 4:59 pm 2015-10-19 16:59

Aşağıdakılara imkan verən parametr ayrıştırmasının versiyasını təklif etmək istərdim:

 -s p1 --stage p1 -w somefolder --workfolder somefolder -sw p1 somefolder -e=hello 

Buna da (istenmeyen) imkan verir:

 -s--workfolder p1 somefolder -se=hello p1 -swe=hello p1 somefolder 

Seçimdən istifadə etmək üçün = istifadə etməzdən əvvəl qərar verməlisiniz. Bu kod təmiz (iş) deməkdir.

 while [[ $# > 0 ]] do key="$1" while [[ ${key+x} ]] do case $key in -s*|--stage) STAGE="$2" shift # option has parameter ;; -w*|--workfolder) workfolder="$2" shift # option has parameter ;; -e=*) EXAMPLE="${key#*=}" break # option has been fully handled ;; *) # unknown option echo Unknown option: $key #1> exit 10 # either this: my preferred way to handle unknown options break # or this: do this to signal the option has been handled (if exit isn't used) ;; esac # prepare for next option in this key, if any [[ "$key" = -? || "$key" == --* ]]  unset key || key="${key/#-?/-}" done shift # option(s) fully processed, proceed to next input argument done 
4
24 июня '15 в 13:54 2015-06-24 13:54 Cavab 24 İyun saat 15: 00-da saat 13: 00-da qalmok tərəfindən verilir

Aşağıdakı kimi test_args.sh adlı bir skript kabuğunu test_args.sh

 #!/bin/sh until [ $# -eq 0 ] do name=${1:1}; shift; if [[ -z "$1" || $1 == -* ]] ; then eval "export $name=true"; else eval "export $name=$1"; shift; fi done echo "year=$year month=$month day=$day flag=$flag" 

Aşağıdakı əmri yerinə yetirdikdən sonra:

 sh test_args.sh -year 2017 -flag -month 12 -day 22 

Çıxış olacaq:

 year=2017 month=12 day=22 flag=true 
3
11 окт. Cavab 11 oktyabrda John tərəfindən verildi 2017-10-11 01:49 '17 də 1:49 2017-10-11 01:49

Xam dəlilləri saxlayan bir həll. Demonstratlar daxildir.

Mənim qərarım budur. Çox çevik və başqalarından fərqli olaraq, xarici paketləri tələb etməməli və qalan arqumentləri təmiz bir şəkildə idarə etməməlidir.

İstifadə edin: ./myscript -flag flagvariable -otherflag flagvar2

Sizə lazım olan bütün validflags simasını redaktə etməkdir. Bir tire əlavə edir və bütün arqumentləri axtarır. Daha sonra, növbəti dəlilləri bayrağın adı kimi təyin edir, məsələn.

 ./myscript -flag flagvariable -otherflag flagvar2 echo $flag $otherflag flagvariable flagvar2 

Əsas kod (qısa versiya, aşağıda göstərilən nümunələrlə yanaşı, səhvən də versiyası):

 #!/usr/bin/env bash #shebang.io validflags="rate time number" count=1 for arg in $@ do match=0 argval=$1 for flag in $validflags do sflag="-"$flag if [ "$argval" == "$sflag" ] then declare $flag=$2 match=1 fi done if [ "$match" == "1" ] then shift 2 else leftovers=$(echo $leftovers $argval) shift fi count=$(($count+1)) done #Cleanup then restore the leftovers shift $# set -- $leftovers 

Yerli eko nümayişləri ilə şifahi versiya:

 #!/usr/bin/env bash #shebang.io rate=30 time=30 number=30 echo "all args $@" validflags="rate time number" count=1 for arg in $@ do match=0 argval=$1 # argval=$(echo $@ | cut -d ' ' -f$count) for flag in $validflags do sflag="-"$flag if [ "$argval" == "$sflag" ] then declare $flag=$2 match=1 fi done if [ "$match" == "1" ] then shift 2 else leftovers=$(echo $leftovers $argval) shift fi count=$(($count+1)) done #Cleanup then restore the leftovers echo "pre final clear args: $@" shift $# echo "post final clear args: $@" set -- $leftovers echo "all post set args: $@" echo arg1: $1 arg2: $2 echo leftovers: $leftovers echo rate $rate time $time number $number 

Nəhayət, əgər yanlış sübut qəbul olunarsa, bu səhvdir.

 #!/usr/bin/env bash #shebang.io rate=30 time=30 number=30 validflags="rate time number" count=1 for arg in $@ do argval=$1 match=0 if [ "${argval:0:1}" == "-" ] then for flag in $validflags do sflag="-"$flag if [ "$argval" == "$sflag" ] then declare $flag=$2 match=1 fi done if [ "$match" == "0" ] then echo "Bad argument: $argval" exit 1 fi shift 2 else leftovers=$(echo $leftovers $argval) shift fi count=$(($count+1)) done #Cleanup then restore the leftovers shift $# set -- $leftovers echo rate $rate time $time number $number echo leftovers: $leftovers 

Плюсы: Что он делает, он отлично справляется. Он сохраняет неиспользуемые аргументы, которые многие другие решения здесь нет. Он также позволяет вызывать переменные без указания вручную в script. Он также позволяет предустановить переменные, если не указан соответствующий аргумент. (См. Подробный пример).

Минусы: не удается разобрать одну сложную строку arg, например. -xcvf будет обрабатываться как один аргумент. Вы могли бы легко написать дополнительный код в мой, который добавляет эту функциональность.

2
ответ дан Noah 29 авг. '16 в 6:44 2016-08-29 06:44

Смешивание позиционных и флаговых аргументов

- param = arg (равно разграничен)

Свободно смешивание флагов между позиционными аргументами:

 ./script.sh dumbo 127.0.0.1 --environment=production -q -d ./script.sh dumbo --environment=production 127.0.0.1 --quiet -d 

может выполняться с достаточно кратким подходом:

 # process flags pointer=1 while [[ $pointer -le $# ]]; do param=${!pointer} if [[ $param != "-"* ]]; then ((pointer++)) # not a parameter flag so advance pointer else case $param in # paramter-flags with arguments -e=*|--environment=*) environment="${param#*=}";; --another=*) another="${param#*=}";; # binary flags -q|--quiet) quiet=true;; -d) debug=true;; esac # splice out pointer frame from positional list [[ $pointer -gt 1 ]] \  set -- ${@:1:((pointer - 1))} ${@:((pointer + 1)):$#} \ || set -- ${@:((pointer + 1)):$#}; fi done # positional remain node_name=$1 ip_address=$2 

- param arg (пробел)

Обычно проще не смешивать стили --flag=value и --flag value .

 ./script.sh dumbo 127.0.0.1 --environment production -q -d 

Это немного рискованно читать, но все еще актуально

 ./script.sh dumbo --environment production 127.0.0.1 --quiet -d 

Источник

 # process flags pointer=1 while [[ $pointer -le $# ]]; do if [[ ${!pointer} != "-"* ]]; then ((pointer++)) # not a parameter flag so advance pointer else param=${!pointer} ((pointer_plus = pointer + 1)) slice_len=1 case $param in # paramter-flags with arguments -e|--environment) environment=${!pointer_plus}; ((slice_len++));; --another) another=${!pointer_plus}; ((slice_len++));; # binary flags -q|--quiet) quiet=true;; -d) debug=true;; esac # splice out pointer frame from positional list [[ $pointer -gt 1 ]] \  set -- ${@:1:((pointer - 1))} ${@:((pointer + $slice_len)):$#} \ || set -- ${@:((pointer + $slice_len)):$#}; fi done # positional remain node_name=$1 ip_address=$2 
2
ответ дан Mark Fox 27 апр. '15 в 5:42 2015-04-27 05:42

Вот мой подход - с помощью regexp.

  • no getopts
  • он обрабатывает блок коротких параметров -qwerty
  • он обрабатывает короткие параметры -q -w -e
  • он обрабатывает длинные параметры --qwerty
  • вы можете передать атрибут короткому или длинному варианту (если вы используете блок коротких опций, атрибут привязан к последней опции)
  • вы можете использовать пробелы или = для предоставления атрибутов, но атрибут соответствует до тех пор, пока не встретит дефис + пробел "разделитель", поэтому в --q=qwe ty qwe ty есть один атрибут
  • он обрабатывает смешение всего выше, поэтому -oa -op attr ibute --option=att ribu te --op-tion attribute --option att-ribute действительно

skript:

 #!/usr/bin/env sh help_menu() { echo "Usage: ${0##*/} [-h][-l FILENAME][-d] Options: -h, --help display this help and exit -l, --logfile=FILENAME filename -d, --debug enable debug " } parse_options() { case $opt in h|help) help_menu exit ;; l|logfile) logfile=${attr} ;; d|debug) debug=true ;; *) echo "Unknown option: ${opt}\nRun ${0##*/} -h for help."> exit 1 esac } options=$@ until [ "$options" = "" ]; do if [[ $options =~ (^ *(--([a-zA-Z0-9-]+)|-([a-zA-Z0-9-]+))(( |=)(([\_\.\?\/\\a-zA-Z0-9]?[ -]?[\_\.\?a-zA-Z0-9]+)+))?(.*)|(.+)) ]]; then if [[ ${BASH_REMATCH[3]} ]]; then # for --option[=][attribute] or --option[=][attribute] opt=${BASH_REMATCH[3]} attr=${BASH_REMATCH[7]} options=${BASH_REMATCH[9]} elif [[ ${BASH_REMATCH[4]} ]]; then # for block options -qwert[=][attribute] or single short option -a[=][attribute] pile=${BASH_REMATCH[4]} while (( ${#pile} > 1 )); do opt=${pile:0:1} attr="" pile=${pile/${pile:0:1}/} parse_options done opt=$pile attr=${BASH_REMATCH[7]} options=${BASH_REMATCH[9]} else # leftovers that don't match opt=${BASH_REMATCH[10]} options="" fi parse_options fi done 
1
ответ дан a_z 15 марта '17 в 16:24 2017-03-15 16:24

Я хочу представить свой проект: https://github.com/flyingangel/argparser

 source argparser.sh parse_args "$@" 

Просто как тот. Окружающая среда будет заполнена переменными с тем же именем, что и аргументы

1
ответ дан Thanh Trung 16 сент. '18 в 20:45 2018-09-16 20:45

Другое решение без getopt [s], POSIX, старый стиль Unix

Похоже на решение Bruno Bronosky опубликовано , это здесь без использования getopt(s) .

Основная отличительная особенность моего решения заключается в том, что он позволяет объединять параметры, как tar -xzf foo.tar.gz , равно tar -x -z -f foo.tar.gz . И так же, как в tar , ps и т.д. Ведущий дефис является необязательным для блока коротких опций (но это можно легко изменить). Также поддерживаются длинные параметры (но когда блок начинается с одного, тогда требуются два ведущих дефиса).

Код с примерами параметров

Длинные опции также объединены

Кроме того, вы также можете иметь длинные опции в блоке параметров, учитывая, что они встречаются последними в блоке. Таким образом, следующие командные строки эквивалентны (включая порядок, в котором обрабатываются параметры и его аргументы):

  • -cba ZYX
  • cba ZYX
  • -cb-aaa-0-args ZYX
  • -c-bbb-1-args ZYX -a
  • --ccc-2-args ZY -ba X
  • c ZY b X a
  • -c ZY -b X -a
  • --ccc-2-args ZY --bbb-1-args X --aaa-0-args

Все это приводит к:

http://mywiki.wooledge.org/BashFAQ/035#Manual_loop с оператором case --long-with-arg=?* , а затем снятие знака равенства (это BTW сайт, в котором говорится, что выполнение конкатенации параметров возможно с помощью некоторые усилия, но "оставили [это] упражнение для читателя", что заставило меня взять их по их слову, но я начал с нуля). 

Другие примечания

POSIX-совместимый, работает даже на старых настройках Busybox, с которыми мне пришлось иметь дело (например, cut , head и getopts ).

1
ответ дан phk 18 окт. '15 в 0:17 2015-10-18 00:17

Верхний ответ на этот вопрос казался немного затруднительным, когда я его попробовал - вот мое решение, которое я нашел более надежным:

 boolean_arg="" arg_with_value="" while [[ $# -gt 0 ]] do key="$1" case $key in -b|--boolean-arg) boolean_arg=true shift ;; -a|--arg-with-value) arg_with_value="$2" shift shift ;; -*) echo "Unknown option: $1" exit 1 ;; *) arg_num=$(( $arg_num + 1 )) case $arg_num in 1) first_normal_arg="$1" shift ;; 2) second_normal_arg="$1" shift ;; *) bad_args=TRUE esac ;; esac done # Handy to have this here when adding arguments to # see if they're working. Just edit the '0' to be '1'. if [[ 0 == 1 ]]; then echo "first_normal_arg: $first_normal_arg" echo "second_normal_arg: $second_normal_arg" echo "boolean_arg: $boolean_arg" echo "arg_with_value: $arg_with_value" exit 0 fi if [[ $bad_args == TRUE || $arg_num < 2 ]]; then echo "Usage: $(basename "$0") <first-normal-arg> <second-normal-arg> [--boolean-arg] [--arg-with-value VALUE]" exit 1 fi 
1
ответ дан Daniel Bigham 08 авг. '16 в 15:42 2016-08-08 15:42

В этом примере показано, как использовать getopt и eval и HEREDOC и shift для обработки коротких и длинных параметров с последующим требуемым значением и без него. Также оператор switch/case является кратким и легко следовать.

 #!/usr/bin/env bash # usage function function usage() { cat << HEREDOC Usage: $progname [--num NUM] [--time TIME_STR] [--verbose] [--dry-run] optional arguments: -h, --help show this help message and exit -n, --num NUM pass in a number -t, --time TIME_STR pass in a time string -v, --verbose increase the verbosity of the bash script --dry-run do a dry run, don't change any files HEREDOC } # initialize variables progname=$(basename $0) verbose=0 dryrun=0 num_str= time_str= # use getopt and store the output into $OPTS # note the use of -o for the short options, --long for the long name options # and a : for any option that takes a parameter OPTS=$(getopt -o "hn:t:v" --long "help,num:,time:,verbose,dry-run" -n "$progname" -- "$@") if [ $? != 0 ] ; then echo "Error in command line arguments." > ; usage; exit 1 ; fi eval set -- "$OPTS" while true; do # uncomment the next line to see how shift is working # echo "\$1:\"$1\" \$2:\"$2\"" case "$1" in -h | --help ) usage; exit; ;; -n | --num ) num_str="$2"; shift 2 ;; -t | --time ) time_str="$2"; shift 2 ;; --dry-run ) dryrun=1; shift ;; -v | --verbose ) verbose=$((verbose + 1)); shift ;; -- ) shift; break ;; * ) break ;; esac done if (( $verbose > 0 )); then # print out all the parameters we read in cat <<-EOM num=$num_str time=$time_str verbose=$verbose dryrun=$dryrun EOM fi # The rest of your script below 

Наиболее значимыми строками script выше являются следующие:

 OPTS=$(getopt -o "hn:t:v" --long "help,num:,time:,verbose,dry-run" -n "$progname" -- "$@") if [ $? != 0 ] ; then echo "Error in command line arguments." > ; exit 1 ; fi eval set -- "$OPTS" while true; do case "$1" in -h | --help ) usage; exit; ;; -n | --num ) num_str="$2"; shift 2 ;; -t | --time ) time_str="$2"; shift 2 ;; --dry-run ) dryrun=1; shift ;; -v | --verbose ) verbose=$((verbose + 1)); shift ;; -- ) shift; break ;; * ) break ;; esac done 

Короткая, точка, читаемая и обрабатывающая практически все (IMHO).

Bu birinə kömək edir.

1
ответ дан phyatt 07 сент. '16 в 21:25 2016-09-07 21:25

Это также может быть полезно знать, вы можете установить значение, и если кто-то предоставляет ввод, переопределите значение по умолчанию с этим значением.

myscript.sh -f./serverlist.txt или просто. /myscript.sh(и он принимает значения по умолчанию)

  #!/bin/bash # --- set the value, if there is inputs, override the defaults. HOME_FOLDER="${HOME}/owned_id_checker" SERVER_FILE_LIST="${HOME_FOLDER}/server_list.txt" while [[ $# > 1 ]] do key="$1" shift case $key in -i|--inputlist) SERVER_FILE_LIST="$1" shift ;; esac done echo "SERVER LIST = ${SERVER_FILE_LIST}" 
1
ответ дан Mike Q 14 июня '14 в 21:01 2014-06-14 21:01

Вот мое улучшенное решение Bruno Bronosky, используя переменные массивы.

он позволяет вам смешивать положение параметров и давать вам массив параметров, сохраняющий порядок без параметров

 #!/bin/bash echo $@ PARAMS=() SOFT=0 SKIP=() for i in "$@" do case $i in -n=*|--skip=*) SKIP+=("${i#*=}") ;; -s|--soft) SOFT=1 ;; *) # unknown option PARAMS+=("$i") ;; esac done echo "SKIP = ${SKIP[@]}" echo "SOFT = $SOFT" echo "Parameters:" echo ${PARAMS[@]} 

Выведет, например:

 $ ./test.sh parameter -s somefile --skip=.c --skip=.obj parameter -s somefile --skip=.c --skip=.obj SKIP = .c .obj SOFT = 1 Parameters: parameter somefile 
1
ответ дан Masadow 06 окт. '15 в 11:53 2015-10-06 11:53

Используйте "аргументы" модуля из bash-modules

Məsələn:

 #!/bin/bash . import.sh log arguments NAME="world" parse_arguments "-n|--name)NAME;S" -- "$@" || { error "Cannot parse command line." exit 1 } info "Hello, $NAME!" 
1
ответ дан Volodymyr M. Lisivka 09 июля '13 в 19:51 2013-07-09 19:51

Я пишу помощник bash, чтобы написать хороший инструмент bash

project home: https://gitlab.mbedsys.org/mbedsys/bashopts

Məsələn:

 #!/bin/bash -ei # load the library . bashopts.sh # Enable backtrace dusplay on error trap 'bashopts_exit_handle' ERR # Initialize the library bashopts_setup -n "$0" -d "This is myapp tool description displayed on help message" -s "$HOME/.config/myapprc" # Declare the options bashopts_declare -n first_name -l first -of -d "First name" -t string -i -s -r bashopts_declare -n last_name -l last -ol -d "Last name" -t string -i -s -r bashopts_declare -n display_name -l display-name -t string -d "Display name" -e "\$first_name \$last_name" bashopts_declare -n age -l number -d "Age" -t number bashopts_declare -n email_list -t string -m add -l email -d "Email adress" # Parse arguments bashopts_parse_args "$@" # Process argument bashopts_process_args 

поможет:

 NAME: ./example.sh - This is myapp tool description displayed on help message USAGE: [options and commands] [-- [extra args]] OPTIONS: -h,--help Display this help -n,--non-interactive true Non interactive mode - [$bashopts_non_interactive] (type:boolean, default:false) -f,--first "John" First name - [$first_name] (type:string, default:"") -l,--last "Smith" Last name - [$last_name] (type:string, default:"") --display-name "John Smith" Display name - [$display_name] (type:string, default:"$first_name $last_name") --number 0 Age - [$age] (type:number, default:0) --email Email adress - [$email_list] (type:string, default:"") 

наслаждайтесь:)

1
ответ дан Emeric Verschuur 21 февр. '17 в 0:30 2017-02-21 00:30

Простые и легко изменяемые параметры могут быть в любом порядке. это можно изменить, чтобы получить параметры в любой форме (-a, - -a, a и т.д.).

 for arg in "$@" do key=$(echo $arg | cut -f1 -d=)' value=$(echo $arg | cut -f2 -d=)' case "$key" in name|-name) read_name=$value;; id|-id) read_id=$value;; *) echo "I dont know what to do with this" ease done 
0
ответ дан terijo001 16 дек. '18 в 10:53 2018-12-16 10:53

Другие вопросы по меткам или Задайте вопрос