zoukankan      html  css  js  c++  java
  • getopts/getopt命令行参数处理

    一、getopts 简介

    由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高。使用内部命令 getopts 可以很方便地处理命令行参数。
    一般格式为:
    getopts options variable
    getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。
    即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,
    并返回退出状态0;如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状态0;
    如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。

    二、使用举例

    #!/bin/bash
    while getopts h:ms option
    do 
        case "$option" in
            h)
                echo "option:h, value $OPTARG"
                echo "next arg index:$OPTIND";;
            m)
                echo "option:m"
                echo "next arg index:$OPTIND";;
            s)
                echo "option:s"
                echo "next arg index:$OPTIND";;
            ?)
                echo "Usage: args [-h n] [-m] [-s]"
                echo "-h means hours"
                echo "-m means minutes"
                echo "-s means seconds"
                exit 1;;
        esac
    done
    echo "*** do something now ***" 
    张小猪(~) -> ./args -h 100 -ms
    
    option:h, value 100
    next arg index:3
    option:m
    next arg index:3
    option:s
    next arg index:4
    *** do something now ***
    张小猪(~) -> ./args -t
    
    ./args: illegal option -- t
    Usage: args [-h n] [-m] [-s]
    -h means hours
    -m means minutes
    -s means seconds

    注:
    1.getopts 允许把选项堆叠在一起(如 -ms)
    2.如要带参数,须在对应选项后加 :(如h后需加参数 h:ms)。此时选项和参数之间至少有一个空白字符分隔,这样的选项不能堆叠。
    3.如果在需要参数的选项之后没有找到参数,它就在给定的变量中存入 ? ,并向标准错误中写入错误消息。
    否则将实际参数写入特殊变量 :OPTARG
    4.另外一个特殊变量:OPTIND,反映下一个要处理的参数索引,初值是 1,每次执行 getopts 时都会更新。

    三、getopt 简介

    利用shell内置的getopts命令来帮助我们处理shell脚本选项和参数,其缺点是只能处理短选项,无法处理长选项。
    下面,本文将要介绍的是getopt命令,它可以同时处理短选项和长选项。
    首先,getopt命令不是一个标准的unix命令,但它在大多数Linux的发行版中都自带了有,
    如果没有,也可以从getopt官网上(http://frodo.looijaard.name/project/getopt)下载安装。
    在getopt的较老版本中,存在一些bug,不大好用,在后来的版本中解决了这些问题,我们称之为getopt增强版。
    通过-T选项,我们可以检查当前的getopt是否为增强版,返回值为4,则表明是增强版的。

    #getopt -T
    #echo $?
    4
    #getopt -V
    getopt (enhanced) 1.1.4
    #!/bin/bash
     
    #echo $@
     
    #-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,
    #其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
    #-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。
    #-n选项后接选项解析错误时提示的脚本名字
    ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`
    if [ $? != 0 ]; then
        echo "Terminating..."
        exit 1
    fi
     
    #echo $ARGS
    #将规范化后的命令行参数分配至位置参数($1,$2,...)
    eval set -- "${ARGS}"
     
    while true
    do
        case "$1" in
            -a|--along) 
                echo "Option a";
                shift
                ;;
            -b|--blong)
                echo "Option b, argument $2";
                shift 2
                ;;
            -c|--clong)
                case "$2" in
                    "")
                        echo "Option c, no argument";
                        shift 2  
                        ;;
                    *)
                        echo "Option c, argument $2";
                        shift 2;
                        ;;
                esac
                ;;
            --)
                shift
                break
                ;;
            *)
                echo "Internal error!"
                exit 1
                ;;
        esac
    done
     
    #处理剩余的参数
    for arg in $@
    do
        echo "processing $arg"
    done
    #./getopt.sh -b 123 -a -c456 file1 file2 
    Option b, argument 123
    Option a
    Option c, argument 456
    processing file1
    processing file2
    
    #.
    /getopt.sh --blong 123 -a --clong=456 file1 file2 Option b, argument 123 Option a Option c, argument 456 processing file1 processing file2

    四、查找选项

     shift命令默认情况下将每个参数变量向左移动一个位置。 $3的值会移动到$2中,$2的值会移动到1中,$1的值则会被删除。
    shift n 表示移动的位数
    以上脚本通过测试第一个参数值的长度执行了一个while循环,当第一个参数的长度为0时,循环结束,测试完第一个参数后,shift命令会将所有的参数位置移动一个位置。

    参考引用:

    https://www.jianshu.com/p/cf71bc239739
    https://www.cnblogs.com/yaoyaojcy/p/9227272.html
    https://blog.csdn.net/nanfeibuyi/article/details/110354570
    https://blog.csdn.net/sofia1217/article/details/52244582

  • 相关阅读:
    Windows32位与64位操作系统的区别【转】
    【C#多线程详解】
    auto_ptr
    #if 1......
    vector 向量容器
    删除可视图中的类不能彻底避免它重新被编译
    _tWinMain 与wWinMain 区别
    explicit 用法
    转:atoi函数的实现
    string类的实现
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/14081018.html
Copyright © 2011-2022 走看看