说,我有一个用这行调用的脚本:
./myscript -vfd ./foo/bar/someFile -o / fizz / someOtherFile
或者这个:
./myscript -v -f -d -o / fizz / someOtherFile ./foo/bar/someFile
什么是
我对这个问题迟到了4年,但是想要回馈。我使用前面的答案作为整理我的旧adhoc param解析的起点。然后我重构了以下模板代码。它使用=或空格分隔的参数处理长和短参数,以及组合在一起的多个短参数。最后,它将任何非参数参数重新插入到$ 1,$ 2 ..变量中。我希望它有用。
#!/usr/bin/env bash # NOTICE: Uncomment if your script depends on bashisms. #if [ -z "$BASH_VERSION" ]; then bash $0 $@ ; exit $? ; fi echo "Before" for i ; do echo - $i ; done # Code template for parsing command line parameters using only portable shell # code, while handling both long and short params, handling '-f file' and # '-f=file' style param data and also capturing non-parameters to be inserted # back into the shell positional parameters. while [ -n "$1" ]; do # Copy so we can modify it (can't modify $1) OPT="$1" # Detect argument termination if [ x"$OPT" = x"--" ]; then shift for OPT ; do REMAINS="$REMAINS \"$OPT\"" done break fi # Parse current opt while [ x"$OPT" != x"-" ] ; do case "$OPT" in # Handle --flag=value opts like this -c=* | --config=* ) CONFIGFILE="${OPT#*=}" shift ;; # and --flag value opts like this -c* | --config ) CONFIGFILE="$2" shift ;; -f* | --force ) FORCE=true ;; -r* | --retry ) RETRY=true ;; # Anything unknown is recorded for later * ) REMAINS="$REMAINS \"$OPT\"" break ;; esac # Check for multiple short options # NOTICE: be sure to update this pattern to match valid options NEXTOPT="${OPT#-[cfr]}" # try removing single short opt if [ x"$OPT" != x"$NEXTOPT" ] ; then OPT="-$NEXTOPT" # multiple short opts, keep going else break # long form, exit inner loop fi done # Done with that param. move to next shift done # Set the non-parameters back into the positional parameters ($1 $2 ..) eval set -- $REMAINS echo -e "After: \n configfile='$CONFIGFILE' \n force='$FORCE' \n retry='$RETRY' \n remains='$REMAINS'" for i ; do echo - $i ; done
此示例显示了如何使用 getopt 和 eval 和 HEREDOC 和 shift 处理具有和不具有所需值的短参数和长参数。此外,switch / case语句简洁易懂。
getopt
eval
HEREDOC
shift
#!/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." >&2 ; 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
上面脚本中最重要的部分是:
OPTS=$(getopt -o "hn:t:v" --long "help,num:,time:,verbose,dry-run" -n "$progname" -- "$@") if [ $? != 0 ] ; then echo "Error in command line arguments." >&2 ; 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
简短,重点,可读,并处理几乎所有事情(恕我直言)。
希望能帮助别人。
假设我们创建一个名为的shell脚本 test_args.sh 如下
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"
运行以下命令后:
sh test_args.sh -year 2017 -flag -month 12 -day 22
输出将是:
year=2017 month=12 day=22 flag=true
我写了一个bash助手来编写一个很棒的bash工具
项目主页: https://gitlab.mbedsys.org/mbedsys/bashopts
例:
#!/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 -o f -d "First name" -t string -i -s -r bashopts_declare -n last_name -l last -o l -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:"")
请享用 :)
传递键 - 值对参数的两种常用方法是:
--option argument
用法 ./myscript.sh -e conf -s /etc -l /usr/lib /etc/hosts
./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}"/*."${EXTENSION}" | wc -l) if [[ -n $1 ]]; then echo "Last line of file specified as non-opt/last argument:" tail -1 "$1" fi
--option=argument
用法 ./myscript.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts
./myscript.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts
#!/bin/bash for i in "$@" do case $i in -e=*|--extension=*) EXTENSION="${i#*=}" shift # past argument=value ;; -s=*|--searchpath=*) SEARCHPATH="${i#*=}" shift # past argument=value ;; -l=*|--lib=*) LIBPATH="${i#*=}" shift # past argument=value ;; --default) DEFAULT=YES shift # past argument with no value ;; *) # unknown option ;; esac done echo "FILE EXTENSION = ${EXTENSION}" echo "SEARCH PATH = ${SEARCHPATH}" echo "LIBRARY PATH = ${LIBPATH}" echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l) if [[ -n $1 ]]; then echo "Last line of file specified as non-opt/last argument:" tail -1 $1 fi
为了更好地理解 ${i#*=} 在中搜索“子串删除” 本指南 。它在功能上等同于 `sed 's/[^=]*=//' <<< "$i"` 它调用一个不必要的子进程或 `echo "$i" | sed 's/[^=]*=//'` 哪个叫 二 不必要的子过程。
${i#*=}
`sed 's/[^=]*=//' <<< "$i"`
`echo "$i" | sed 's/[^=]*=//'`
从: http://mywiki.wooledge.org/BashFAQ/035#getopts
的 getopt(1)限制 强> (年龄较大,相对较新 getopt 版本):
更近 getopt 版本没有这些限制。
此外,POSIX shell(和其他)提供 getopts 没有这些限制。这是一个简单化的 getopts 例:
getopts
#!/bin/sh # A POSIX variable OPTIND=1 # Reset in case getopts has been used previously in the shell. # Initialize our own variables: output_file="" verbose=0 while getopts "h?vf:" opt; do case "$opt" in h|\?) show_help exit 0 ;; v) verbose=1 ;; f) output_file=$OPTARG ;; esac done shift $((OPTIND-1)) [ "${1:-}" = "--" ] && shift echo "verbose=$verbose, output_file='$output_file', Leftovers: $@" # End of file
的优点 getopts 是:
dash
-vf filename
缺点 getopts 是它只能处理短期权利( -h 不是 --help )没有额外的代码。
-h
--help
有一个 getopts教程 这解释了所有语法和变量的含义。在bash中,也有 help getopts ,这可能是提供信息的。
help getopts
这是我使用变量数组的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
这是我在一个函数中做的工作,以避免在堆栈中更高的位置同时运行getopts:
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 ... }
我想提供我的选项解析版本,允许以下内容:
-s p1 --stage p1 -w somefolder --workfolder somefolder -sw p1 somefolder -e=hello
也允许这样(可能是不需要的):
-s--workfolder p1 somefolder -se=hello p1 -swe=hello p1 somefolder
您必须在使用前决定是否要在选项上使用=。这是为了保持代码清洁(ish)。
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>&2 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
这也可能有用,要知道,您可以设置一个值,如果有人提供输入,则使用该值覆盖默认值。
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}"
我认为这个很简单,可以使用:
#!/bin/bash # readopt='getopts $opts opt;rc=$?;[ $rc$opt == 0? ]&&exit 1;[ $rc == 0 ]||{ shift $[OPTIND-1];false; }' opts=vfdo: # Enumerating options while eval $readopt do echo OPT:$opt ${OPTARG+OPTARG:$OPTARG} done # Enumerating arguments for arg do echo ARG:$arg done
调用示例:
./myscript -v -do /fizz/someOtherFile -f ./foo/bar/someFile OPT:v OPT:d OPT:o OPTARG:/fizz/someOtherFile OPT:f ARG:./foo/bar/someFile
简单易修改,参数可以任意顺序。这可以修改为以任何形式(-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
getopt() / getopts() 是个不错的选择。被偷走了 这里 :
getopt()
getopts()
这个迷你脚本中显示了“getopt”的简单使用:
#!/bin/bash echo "Before getopt" for i do echo $i done args=`getopt abc:d $*` set -- $args echo "After getopt" for i do echo "-->$i" done
我们所说的是-a中的任何一个, -b,-c或-d将被允许,但是-c后跟一个参数(“c:”表示)。 如果我们称之为“g”并试一试:
我们所说的是-a中的任何一个, -b,-c或-d将被允许,但是-c后跟一个参数(“c:”表示)。
如果我们称之为“g”并试一试:
bash-2.05a$ ./g -abc foo Before getopt -abc foo After getopt -->-a -->-b -->-c -->foo -->--
我们从两个论点开始,并且 “getopt”打破了选择和 把每个人都放在自己的论点中。它也是 添加 ” - ”。
如果安装了#1,那么getopts工作得很好;#2你打算在同一平台上运行它。 OSX和Linux(例如)在这方面表现不同。
这是一个支持equals,non-equals和boolean标志的(非getopts)解决方案。例如,您可以通过以下方式运行脚本:
./script --arg1=value1 --arg2 value2 --shouldClean # parse the arguments. COUNTER=0 ARGS=("$@") while [ $COUNTER -lt $# ] do arg=${ARGS[$COUNTER]} let COUNTER=COUNTER+1 nextArg=${ARGS[$COUNTER]} if [[ $skipNext -eq 1 ]]; then echo "Skipping" skipNext=0 continue fi argKey="" argVal="" if [[ "$arg" =~ ^\- ]]; then # if the format is: -key=value if [[ "$arg" =~ \= ]]; then argVal=$(echo "$arg" | cut -d'=' -f2) argKey=$(echo "$arg" | cut -d'=' -f1) skipNext=0 # if the format is: -key value elif [[ ! "$nextArg" =~ ^\- ]]; then argKey="$arg" argVal="$nextArg" skipNext=1 # if the format is: -key (a boolean flag) elif [[ "$nextArg" =~ ^\- ]] || [[ -z "$nextArg" ]]; then argKey="$arg" argVal="" skipNext=0 fi # if the format has not flag, just a value. else argKey="" argVal="$arg" skipNext=0 fi case "$argKey" in --source-scmurl) SOURCE_URL="$argVal" ;; --dest-scmurl) DEST_URL="$argVal" ;; --version-num) VERSION_NUM="$argVal" ;; -c|--clean) CLEAN_BEFORE_START="1" ;; -h|--help|-help|--h) showUsage exit ;; esac done
EasyOptions 不需要任何解析:
## 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
使用模块“参数” bash的模块
#!/bin/bash . import.sh log arguments NAME="world" parse_arguments "-n|--name)NAME;S" -- "$@" || { error "Cannot parse command line." exit 1 } info "Hello, $NAME!"
相近 Bruno Bronosky发布的解决方案 这是一个没有使用的 getopt(s) 。
getopt(s)
我的解决方案的主要区别在于它允许将选项连接在一起就像 tar -xzf foo.tar.gz 等于 tar -x -z -f foo.tar.gz 。就像在里面一样 tar , ps 前导连字符对于短选项块是可选的(但这可以很容易地改变)。也支持长选项(但是当一个块以一个块开始时,则需要两个前导连字符)。
tar -xzf foo.tar.gz
tar -x -z -f foo.tar.gz
tar
ps
#!/bin/sh echo echo "POSIX-compliant getopt(s)-free old-style-supporting option parser from phk@[se.unix]" echo print_usage() { echo "Usage: $0 {a|b|c} [ARG...] Options: --aaa-0-args -a Option without arguments. --bbb-1-args ARG -b ARG Option with one argument. --ccc-2-args ARG1 ARG2 -c ARG1 ARG2 Option with two arguments. " >&2 } if [ $# -le 0 ]; then print_usage exit 1 fi opt= while :; do if [ $# -le 0 ]; then # no parameters remaining -> end option parsing break elif [ ! "$opt" ]; then # we are at the beginning of a fresh block # remove optional leading hyphen and strip trailing whitespaces opt=$(echo "$1" | sed 's/^-\?\([a-zA-Z0-9\?-]*\)/\1/') fi # get the first character -> check whether long option first_chr=$(echo "$opt" | awk '{print substr($1, 1, 1)}') [ "$first_chr" = - ] && long_option=T || long_option=F # note to write the options here with a leading hyphen less # also do not forget to end short options with a star case $opt in -) # end of options shift break ;; a*|-aaa-0-args) echo "Option AAA activated!" ;; b*|-bbb-1-args) if [ "$2" ]; then echo "Option BBB with argument '$2' activated!" shift else echo "BBB parameters incomplete!" >&2 print_usage exit 1 fi ;; c*|-ccc-2-args) if [ "$2" ] && [ "$3" ]; then echo "Option CCC with arguments '$2' and '$3' activated!" shift 2 else echo "CCC parameters incomplete!" >&2 print_usage exit 1 fi ;; h*|\?*|-help) print_usage exit 0 ;; *) if [ "$long_option" = T ]; then opt=$(echo "$opt" | awk '{print substr($1, 2)}') else opt=$first_chr fi printf 'Error: Unknown option: "%s"\n' "$opt" >&2 print_usage exit 1 ;; esac if [ "$long_option" = T ]; then # if we had a long option then we are going to get a new block next shift opt= else # if we had a short option then just move to the next character opt=$(echo "$opt" | awk '{print substr($1, 2)}') # if block is now empty then shift to the next one [ "$opt" ] || shift fi done echo "Doing something..." exit 0
有关示例用法,请参阅下面的示例。
对于它的价值,带参数的选项不是最后一个(只需要很长的选项)。所以,例如在 tar (至少在某些实现中) f 选项必须是最后的,因为文件名如下( tar xzf bar.tar.gz 工作,但 tar xfz bar.tar.gz 不是)这不是这种情况(见后面的例子)。
f
tar xzf bar.tar.gz
tar xfz bar.tar.gz
作为另一个奖励,通过具有所需选项的参数按选项的顺序消耗选项参数。只需使用命令行查看我的脚本输出 abc X Y Z (要么 -abc X Y Z ):
abc X Y Z
-abc X Y Z
Option AAA activated! Option BBB with argument 'X' activated! Option CCC with arguments 'Y' and 'Z' activated!
此外,您还可以在选项块中有长选项,因为它们最后出现在块中。因此以下命令行都是等效的(包括处理选项及其参数的顺序):
-cba Z Y X
cba Z Y X
-cb-aaa-0-args Z Y X
-c-bbb-1-args Z Y X -a
--ccc-2-args Z Y -ba X
c Z Y b X a
-c Z Y -b X -a
--ccc-2-args Z Y --bbb-1-args X --aaa-0-args
所有这些导致:
Option CCC with arguments 'Z' and 'Y' activated! Option BBB with argument 'X' activated! Option AAA activated! Doing something...
带有可选参数的选项应该可以通过一些工作来实现,例如:通过向前看是否有一个没有连字符的块;然后,用户需要在具有可选参数的参数的块之后的每个块的前面放置连字符。也许这太复杂了,无法与用户沟通,所以在这种情况下只需要一个前导连字符。
随着多个可能的参数,事情变得更加复杂。我建议不要通过确定一个参数是否适合它来使选项变得聪明(例如,使用一个选项只需要一个数字作为可选参数),因为这可能在将来中断。
我个人赞成其他选项而不是可选参数。
就像可选参数一样,我不喜欢这个(BTW,是否有讨论不同参数样式的优点/缺点的线程?)但是如果你想要这个,你可以自己实现它就像在 http://mywiki.wooledge.org/BashFAQ/035#Manual_loop 用一个 --long-with-arg=?* 案例陈述,然后剥离等号(这是BTW网站,说可以通过一些努力使参数连接成为可能,但“留下[它]作为读者的练习”,这使我听取了他们的话,但我从刮)。
--long-with-arg=?*
POSIX兼容,甚至可以用于我必须处理的古老的Busybox设置(例如 cut , head 和 getopts 失踪)。
cut
head
在位置参数之间自由混合标志:
./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
通常情况下,不要混淆 --flag=value 和 --flag value 样式。
--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
我想提交我的项目: https://github.com/flyingangel/argparser
source argparser.sh parse_args "$@"
就那么简单。将使用与参数同名的变量填充环境
来自: digitalpeer.com 稍作修改
用法 myscript.sh -p=my_prefix -s=dirname -l=libname
myscript.sh -p=my_prefix -s=dirname -l=libname
#!/bin/bash for i in "$@" do case $i in -p=*|--prefix=*) PREFIX="${i#*=}" ;; -s=*|--searchpath=*) SEARCHPATH="${i#*=}" ;; -l=*|--lib=*) DIR="${i#*=}" ;; --default) DEFAULT=YES ;; *) # unknown option ;; esac done echo PREFIX = ${PREFIX} echo SEARCH PATH = ${SEARCHPATH} echo DIRS = ${DIR} echo DEFAULT = ${DEFAULT}
的 script.sh 强>
#!/bin/bash while [[ "$#" -gt 0 ]]; do case $1 in -d|--deploy) deploy="$2"; shift;; -u|--uglify) uglify=1;; *) echo "Unknown parameter passed: $1"; exit 1;; esac; shift; done echo "Should deploy? $deploy" echo "Should uglify? $uglify"
的 用法: 强>
./script.sh -d dev -u # OR: ./script.sh --deploy dev --uglify