zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Qt计算器开发(三):执行效果及项目总结
    [HNOI2019]校园旅行
    How to fix nuget Unrecognized license type MIT when pack
    How to fix nuget Unrecognized license type MIT when pack
    git 通过 SublimeMerge 处理冲突
    git 通过 SublimeMerge 处理冲突
    git 上传当前分支
    git 上传当前分支
    gif 格式
    gif 格式
  • 原文地址:https://www.cnblogs.com/muahao/p/6252392.html
Copyright © 2011-2022 走看看