getopts举例说明
#!/bin/bash file= verbose= quiet= long= while getopts :f:vql opt do case $opt in f) file=$OPTARG ;; v) verbose=true quiet= ;; q) quiet=true verbose= ;; l) long=true ;; ?) echo "$0: invalid option -$OPTARG" >&2 echo "Usage: $0 [-f file] [-vql] [files ...]" >&2 exit 1 ;; esac done shift $((OPTIND - 1)) echo file=$file echo verbose=$verbose echo quiet=$quiet echo long=$long
优点:
支持多个选项连续使用如 -vl
自动处理 "-"
缺点:
不支持长选项,如果需要支持长选项使用getopt
原理:
1、getopts隐含了两个变量$OPTARG(选项的参数) $OPTIND(下一个要处理的参数的索引,初始为1)
2、getopts第一个参数定义了一系列合法的选项”:f:vql“
2.1 开头的冒号":"可选:作用是getopts不返回任何错误信息,当遇到非法选项时,更新getopts变量的值为"?",并保存非法选项到$OPTARG
2.2 f选项后跟一个冒号":",表示f有一个必须存在的参数,(实际在使用-f选项时,选项和参数中可以无空格,也可以有空格,根据IFS截取,例如./1.sh -f -v a则-v为参数,注意顺序!)
3、getopts第二个参数为变量名,用于保存每次getopts运行时找到的合法选项字母,找到不合法选项时getopts为问号。
getopt举例说明
#!/bin/bash TEMP=`getopt -o ab:c:: -l a-long,b-long:,c-long:: -n 'Error' -- "$@"` if [ $? -ne 0 ];then echo "Terminating..." >&2 exit 1 fi eval set -- "$TEMP" echo "$#, $1, $2, $3, $4, $5, $6, $7" while true do case "$1" in -a|--a-long) echo "opt: $1" shift ;; -b|--b-long) echo "opt: $1, arg: $2" shift 2 ;; -c|--c-long) case $2 in *) echo "opt: $1, arg: $2" shift 3 ;; "") echo "opt: $1, noarg" shift ;; esac ;; --) shift break ;; *) echo "Usage: $0 [-a|--a-long] [-b|--b-long <arg>] [-c|--c-long [arg]]" exit 1 ;; esac done echo "Remaining arguments:" for arg in $@ do echo -n "$arg " done echo
优点:
支持长选项
缺点:
不自动处理"-"
没有像getopts那样的隐含变量OPTARG和OPTIND,需要手动处理
原理:
根据用户指定的合法选项重新对选项进行整理排序
关于定义合法选项的双冒号意思为:该选项的参数是可选的,其它同getopts
-o定义短选项
-l定义长选项
-n定义当需要有参数的选项没有给于参数时的错误提示符
注:
getopt测试中遇到一个错误,可能是BUG,也可能是我脚本有书写错误
-c选项的参数为可选,但是getopt整理后把-c的参数放到了最后,原位置为空,测试结果如下
[root@localhost ~]# ./3.sh -b b 3, -b, b, --, , , , opt: -b, arg: b Remaining arguments: [root@localhost ~]# ./3.sh -c c 4, -c, , --, c, , , opt: -c, arg: Usage: ./3.sh [-a|--a-long] [-b|--b-long <arg>] [-c|--c-long [arg]]
有知道这个问题的朋友请留言,探讨一下。
转载于:https://blog.51cto.com/sndapk/1313849