#!/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
#!/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]]
有知道这个问题的朋友请留言,探讨一下。