标签 getopt 下的文章

getopts场景一:

脚本接收选项-a、-b,如果是-a,安装a服务,如果是b,安装b服务。

#!/bin/bash
#
# getopts不支持长选项

while getopts "ab" arg
do
    case $arg in
        a)
            echo "install a"
            ;;
        b)
            echo "install b"
            ;;
        ?)
            echo "Unkonw argument"
            exit 1
            ;;
    esac
done

getopts场景二:

-b选项需要指定一个参数

#!/bin/bash
#
#

while getopts "ab:" arg
do
    case $arg in
        a)
            echo "a's arg is $OPTARG"
            ;;
        b)
            echo "b's arg is $OPTARG"
            ;;
        ?)
            echo "Unknow argument"
            exit 1
            ;;
    esac
done

getopt场景一:

脚本接收短选项-a、-b 或长选项--servera、--serverb

#!/bin/bash
#
# getopt支持长选项
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项

TEMP=`getopt -o ab --long servera,serverb -n "$0" -- "$@"`

[ $? -eq 0 ] || { exit 1; }

# set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

while true; do
    case "$1" in
        -a|--servera)
            echo "install servera"
            shift
            ;;
        -b|--serverb)
            echo "install serverb"
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Error"
            exit 1
            ;;
    esac
done

getopt场景二:

#!/bin/bash
#
#-b选项可以有一个可选参数,可选参数必须紧贴选项
TEMP=`getopt -o ab:: --long servera,serverb:: -n "$0" -- "$@"`

[ $? -eq 0 ] || { exit 1; }
echo "$TEMP"
eval set -- "$TEMP"
echo "$TEMP"

while true; do
    case "$1" in
        -a|--servera)
            echo "install servera"
            shift
            ;;
        -b|--serverb)
            case "$2" in
                "")
                    echo "Option b, no argument"
                    shift 2
                    ;;
                *)
                    echo "Option c, argument is $2"
                    shift 2
                    ;;
            esac
            ;;
        --)
            shift
            break
        *)
            echo "Error"
            exit 1
    esac
done