getopt使用例子

绝大多数脚本使用getopts应该就可以满足需求了,如果需要支持长选项以及可选参数,那么就需要使用getopt了.

getopt和getopts类似,也是通过冒号来区分选项是否接受参数值,其定义如下:

后面没有冒号,表示选项不接参数
后面有一个冒号,表示选项必须接参数
后面有两个冒号,表示选项参数可选
我们来看一下这个命令

example.sh -a -b value2 --argv3 value3
我们看到这个命令有两个短选项和一个长选项,分别是-a,-b和--argv3,其中a不接收参数,b和argv3接收参数,我们看一下如何在脚本里面进行定义

ARGS=`getopt -o ab: -l "argv3:,help"  -- "$@"`
eval set -- "${ARGS}"

因为getopt是一个独立的程序,所以我们使用``来进行getopt的执行和结果获取,并通过eval set将规范化后的命令行参数分配至位置参数(1,1,2,...)

其中-o或--options选项后面接可接受的短选项;-l或--long选项后面接可接受的长选项,用逗号分开

一个完整的示例脚本如下:

#!/bin/bash

ARGS=`getopt -o ab: -l "argv3:,help" -- "$@"`
eval set -- "${ARGS}"

while true;
do
    case "$1" in
        -a) 
            echo "i am a"
            shift
            ;;
        -b) 
            echo "i am b, my value is $2" 
            shift 2
            ;;
        --argv3)
            echo "i am argv3, my value is $2"
            shift 2
            ;;
        --help)
            echo "i am help info"
            exit 0
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Internal error!"
            exit 1
            ;;
    esac
done

if [[ $# -eq 0  ]];then
    USAGE
fi

ARGS=`getopt -o d: -l "prepare,cleanup,ip:,sleep:,help" -- "$@"`
eval set -- "${ARGS}"

while true;
do
    case "$1" in
        --prepare)
			echo "prepare"
            ENV_PREPARE
			exit 0
            ;;
        --cleanup)
			echo cleanup
			ENV_CLEAN
			exit 0
            ;;
        --ip)
			SERVER_IP=$2
            shift 2
			;;
        --sleep)
			SLEEP_TIME=$2
            shift 2
			;;
        --help)
			USAGE
            exit 0
            ;;
        -d)
			DO_CASE $2
			if [[ $? -eq 0 && ! -z $SLEEP_TIME ]];then
				#只有server需要获取结果
			   GET_RESULT
			fi
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Internal error!"
            exit 1
            ;;
    esac
done
posted @ 2017-01-05 15:00  苏小北1024  阅读(2666)  评论(0编辑  收藏  举报