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

转载于:https://www.cnblogs.com/muahao/p/6252392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值