zoukankan      html  css  js  c++  java
  • Linux-Bash Shell-获取命令行参数

    #!/bin/bash
    
    ################################################################################
    # Author   : Jet Bi
    # License  : www.cyeap.com    
    # Summary  : Bash Shell获取命令行参数的示例
    # Notes    : -
    ################################################################################
    
    #-------------------------------------------------------------------------------
    # 方式一: 直接利用$n(n为1-9)的方式按位置进行获取
    #-------------------------------------------------------------------------------
    echo "第一个参数:"$1
    echo "第二个参数:"$2
    echo "第三个参数:"$3
    
    #-------------------------------------------------------------------------------
    # 方式二: 使用内置命令getopts获取命名参数
    #     语法:
    #         getopts optstring varname
    #     解析:
    #         1.optstring是一个符合规则的字符串,如: 'a:b:cd'
    #           这表示可以传4个选项 -a -b -c -d 其中-a, -b选项的:表示是选项后面要有参数的
    #         2.varname表示读取到的选项
    #         3.特殊变量${OPTARG}能够获取选项后面跟的参数
    #         4.特殊变量${OPTIND}反映下一个要处理的参数索引,初始值是1
    #     注:
    #         1.getopts不支持长选项参数
    #         2.对于有参数的选项必须要用空格分隔,如-a arg
    #         3.对于没有参数的选项是可以连起来的,如 -bc 等同于 -b -c
    #-------------------------------------------------------------------------------
    while getopts 'a:bcd:' OPT; do
        case ${OPT} in
          a)
            echo "选项-a已经生效"
            echo "选项-a是可以带参数的,参数值为:"${OPTARG}
            ;;
          b)
            echo "选项-b已经生效"
            echo "选项-b是不需要参数的"
            ;;
          c)
            echo "选项-c已经生效"
            echo "选项-c是不需要参数的"
            ;;
          d)
            echo "选项-d已经生效"
            echo "选项-d是可以带参数的,参数值为:"${OPTARG}
            ;;
          *)
            echo "无效的参数"
            ;;
        esac
    done
    
    #-------------------------------------------------------------------------------
    # 方式三: 使用外部命令getopt获取命名参数
    #     语法
    #         getopt [OPTION...] -o 短选项optstring -l 长选项optstring -- parameters
    #     解析
    #         1.getopt命令的选项说明
    #             -a  表示是否支持长选项的简单模式(即以一个 - 接长选项),必须与-l同时用
    #             -o  后面接getopt支持短选项列表 
    #             -l  后面接getopt支持长选项列表
    #         2.optstring是一个符合规则的字符串,如: 'a:,b:,cd::'(短选项)'apple:,banana:,cherry::'(长选项)
    #             一个:代表必选参数
    #             两个::代表可选参数  
    #         3.每解析一个选项,有参数的shift 2 ,没有参数的 shift   
    #-------------------------------------------------------------------------------
    
    # 1.使用getopt获取一个解析后的字符串
    parse_options=$(getopt -o a,b:,c::,d -l apple,banana:,cherry:: -- $@)
    
    # 2.将传递的参数设置成刚解析的字符串,--代表传递的参数,eval是为了防止有shell关键字和可选参数的的空格识别
    eval set -- $parse_options
    
    # 3.遍历参数
    while true; do
        case "$1" in
          -a | --apple)
              echo "I have an apple!"
              shift
              ;;
          -b | --banana)
              echo "I have a banana,banana is $2"
              shift 2
              ;;
          -c | --cherry)
              case $2 in
                '')
                    echo "I have a cherry!"
                    shift 2
                    ;;
                *)
                    echo "I have a cherry!It is $2"
                    shift 2
                    ;;
              esac
              ;;
          -d)
              echo "I have a dog!"
              shift
              ;;
          --)
              shift
              break
              ;;
          *)
              echo "Parse Error!"
              exit 1
              ;;
        esac
    done
    #-------------------------------------------------------------------------------
    #getopts和getopt的区别
    #
    #1.getopts 是Shell内建命令
    #  getopt  是一个独立外部工具
    #2.getopts 使用语法简单
    #  getopt  使用语法复杂
    #3.getopts 不支持长选项 
    #  getopt  支持长选项
    #4.getopts 不会重排所有参数的顺序
    #  getopt  会重排参数顺序 
    #5.getopts 的Shell内置 OPTARG 这个变量,getopts 通过修改这个变量依次获取参数
    #  getopt  必须使用 set 来重新设定位置参数,然后在 getopt 中使用 shift 来依次获取参数
    #6.getopts 可以接受参数有空格
    #  getopt  只有新版的才可以有空格
    #-------------------------------------------------------------------------------
    
  • 相关阅读:
    PostgreSQL在Update时使用Substring函数截取字符串并且加上CASE WHEN THEN条件判断
    清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置
    基于ABP模块组件与依赖注入组件的项目插件开发
    jenkins git can't work ERROR: Timeout after 10 minutes ERROR: Error fetching remote repo 'origin'
    SV randomize
    SV class
    SV coverage
    uvm设计分析——reg
    shell bash-shell
    scrapy的安装
  • 原文地址:https://www.cnblogs.com/qq1207501666/p/13192660.html
Copyright © 2011-2022 走看看