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]]

有知道这个问题的朋友请留言,探讨一下。