• shell脚本中getopt介绍


      介绍

            使用过linux命令的都用过xxx -a --append  -f a.tar.gz  /etc/temp这种类型的命令

    上面的命令包含了短选项、长选项、参数、选项参数

    例如"-a"是短选项,"--append"是长选项,a.tar.gz是选项“-f”的选项参数(传递给选项的参数),/etc/temp则只是参数,为非选项参数

    bash的getopt命令经常用在shell脚本内部或函数内部,用来解析脚本执行或函数执行时传递的选项、参数

    getopt -o SHORT_OPTIONS -l LONG_OPTIONS -n "$0" -- "$@"

    -o SHORT_OPTIONS 或 --options SHORT_OPTIONS

    getopt通过“-o”收集传递的短选项和它们对应的参数

    -l LONG_OPTIONS或--longoptions LONG_OPTIONS或--long LONG_OPTIONS

    同上,长选项用-l或者后面2个

    -n NAME

    getopt在解析命令行时,如果解析出错则执行NAME脚本

    -- "$@"

    其中--表示getopt命令自身的选项到此结束,后面的元素都是要被getopt解析的命令行参数,"$@"表示所有命令行参数

     

     getopt解析短选项时:

    多个短选项开易连接在一起

    如果某个短选项需要一个参数,则在选项后面跟一个冒号

    如果某个短选项参数可选,则跟两个冒号

    例如:getopt -o ab:c::,解析为:-a -b arg_b -c [arg_c] ,arg_b是"-b"选项必须的,arg_c是"-c"选项可选的,-a无须参数

    getopt解析长选项时:

    可以一次性指定多个选项名称,但是用逗号分开

    可以多次使用-l选项,多次解析长选项

    如果某个短选项需要一个参数,则在选项后面跟一个冒号

    如果某个短选项参数可选,则跟两个冒号

    例如:getopt -l add:,remove::,show,其实和上面的短选项类似,不做说明

    getopt解析后处理

    1. ARGS=`getopt -o hc:p:: --long help,case: -n 'run.sh' -- "$@"`
    2. eval set -- "${ARGS}" #将规范化后的命令行参数分配至位置参数($1,$2,...)
    3. while [ -n "$1" ]
    4. do
    5. case "$1" in #循环解析第一个参数
    6. -h|--help)
    7. test_run_help
    8. ;;
    9. -c|--case)
    10. case="$2"
    11. shift
    12. ;;
    13. -p)
    14. case "$2" in
    15. "") echo "Option p, no argument"; shift ;;
    16. *) echo "Option p, argument \`$2'" ; shift ;;
    17. esac ;;
    18. --)
    19. shift ;
    20. break
    21. ;;
    22. *)
    23. break
    24. esac
    25. shift
    26. done

    ./test.sh -c aa -pvv

    Option p, argument `vv'

     上面的命令中用到了eval、set和shift

    eval

    对其后面的命令再次进行shell解析

    #:cat file

    hello world

    #:test = "cat file"

    #:echo $test

    cat file

    #:eval $test  #这里相当于二次解析了,执行了cat file命令

    hello world

    set --

    根据分隔符依次把值赋给$1 $2 $3... ...

    # cat test.sh 
    #!/bin/bash
    echo $1 $2 $3
    set -- aa bb cc  #这里就被替换成了aa bb cc
    echo $1 $2 $3  
    # sh test.sh a b c
    a b c
    aa bb cc

     shift

    将参数左移n个,可以理解成为删除前n个参数,即$1、$2。。。。。

    # cat test.sh 
    #!/bin/bash
    set -- aa bb cc
    echo $1 $2 $3
    shift 1 #这里删除$1,参数只剩bb cc
    echo $1 $2 $3 
    # sh test.sh 
    aa bb cc
    bb cc

  • 相关阅读:
    详解K8s 镜像缓存管理kube-fledged
    《016.SpringBoot+vue校园社团管理系统》【有文档】
    Word处理控件Aspose.Words功能演示:使用 C# 将 Word 文档转换为 Markdown
    GBase8d使用的LDAP基础知识(一):
    MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
    达梦数据库随系统开机自动启动脚本
    网站攻击技术,一篇打包带走!
    HTML导航栏二级菜单(垂直、水平方向)
    51单片机的智能台灯控制系统仿真( proteus仿真+程序+原理图+报告+讲解视频)
    剑指 Offer 25. 合并两个排序的链表
  • 原文地址:https://blog.csdn.net/q2519008/article/details/128143202