zoukankan      html  css  js  c++  java
  • Linux Bash之getopt命令行参数解析

    Unix shell 中内置了命令行参数解析函数getopts,但它仅支持简单的参数解析,不支持长参数,getopt是getopts的增强版,支持长参数。在Python笔记:命令行参数解析中介绍了Python中的命令行参数解析方法getopt(),本文介绍shell中如何使用getopt进行命令行参数解析。

    先看下面脚本(test_getopt.sh):

    #!/bin/bash
    
    FIELD=unset
    DF=unset
    COUNT=unset
    green='33[32m'
    
    help()
    {
      Usage="Usage: sh test_getopt.sh [OPTION]  
    
      Options:
    
            [ -f | --field FIELD]  		-- 字段 
     
            [ -Y | --display-filter DF] 	-- 条件 
     
            [ -c | --count COUNT ]  	-- 计数 
     
            [ -h | --help ]  		-- 帮助信息  
     
            "
      echo -e ${green} $Usage
      exit 2
    }
    
    ARGS=$(getopt -a -n test_getopt.sh -o f:Y:ch --long field:,display-filter:,count,help -- "$@")
    VALID_ARGS=$?
    if [ "$VALID_ARGS" != "0" ]; then
      help  
    fi
    
    eval set -- "$ARGS"
    while :
    do
      case "$1" in
        -f | --field)            FIELD="$2"   ; shift 2  ;;
        -Y | --display-filter)   DF="$2"      ; shift 2  ;;
        -c | --count)            COUNT=2      ; shift    ;;
        -h | --help)             help; exit 0 ; shift    ;;    
        --) shift; break ;;
      esac
    done
    
    echo "FIELD   : $FIELD"
    echo "DF   : $DF "
    echo "COUNT : $COUNT"
    echo "其余参数: $@"
    
    exit 0
    

    下面对脚本进行简要解释:

    1. 在开头可以定义脚本的全局变量,green用于设置字体颜色。

    2. help()函数用于显示帮助信息,说明脚本的使用方法。

    3. ARGS=$(getopt -a -n test_getopt.sh -o f:Y:ch --long field:,display-filter:,count,help -- "$@")

      • 短参数一般在前面加单破折号(-),长参数使用双破折号(--),-a选项可以使长参数支持单破折号(-)
      • 如果参数必须赋值,在后面加冒号(:),
      • -n test_getopt.sh:指定程序名为test_getopt.sh,如果不设置,默认使用getopt
      • -o | --options:短选项
      • -l | --longoptions:长选项
    4. getopt接收所有输入后会返回一个状态码,0表示成功,其他值表示失败,状态码会传递给变量$?,对变量$?做一个判断,如果不为0则打印帮助信息。

    5. eval set -- "$ARGS"

      • eval 命令把字符串当做命令来执行,这里用于处理参数中的转义字符。
      • set 命令将命令行参数替换成getopt格式化后的命令行参数,也就是将getopt格式化的参数分配至位置参数($1,$2,...)
    6. 接下来就是对参数($1,$2,...)进行遍历处理

      • 通过shift来移动获取参数,用它来实现移动一个或者多个位置(也就是弹栈)
      • 每次循环,检查$1参数,对于必须赋值的参数,需要移动两位,因为它后面跟了一个参数值,需要移动两位才能到下一个参数。取值为$2,因为第一个参数为选项名称,第二个参数才是参数值。
      • 移位到--后,表示所有参数解析完成,退出循环。

    运行:

    
    $ sh test_getopt.sh --help
     Usage: sh test_getopt.sh [OPTION]
     Options:
     [ -f | --field FIELD]          -- 字段
     [ -Y | --display-filter DF]    -- 条件
     [ -c | --count COUNT ]         -- 计数
     [ -h | --help ]                -- 帮助信息
    $ 
    $ sh test_getopt.sh -c -f test -Y hello test2
    FIELD   : test
    DF   : hello
    COUNT : 2
    其余参数: test2
    
    --THE END--

    欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

  • 相关阅读:
    JavaScript:原生模拟$.ajax以及jsonp
    Nodejs之路:非I/O的异步API
    Nodejs之路:异步I/O的过程
    同步、异步、阻塞、非阻塞
    spring mvc在普通类中获取HttpServletRequest对象
    Nginx反向代理实现Tomcat多个应用80端口访问
    IIS 7.5配置PHP站点
    程序员与禅师
    MVC一些需要注意的问题
    强制卸载VS2013
  • 原文地址:https://www.cnblogs.com/hiyong/p/14725259.html
Copyright © 2011-2022 走看看