zoukankan      html  css  js  c++  java
  • shell中处理参数getopts命令

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

    getopts引用的三个环境变量:

    OPTARG: 上一个由getopts内置命令处理的选项参数的值, option argument(存放选项参数),当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中

    OPTIND:  下一个由getopts内置命令处理的参数的序号,option index,每次调用脚本它都会被初始值为1,会逐次递增。

    OPTERR: 如果设为1,bash会显示getopts的错误。设为0,不显示getopts的错误。

    getopts 的处理过程:
      调用脚本时,OPTIND为初始化为1。每调用一次getopts,就将下一个选项值赋给name , 选项索引值OPTIND也会指向下一个要处理选项的位置,选项参数则会赋给OPTARG
      getopts 的设计目标是在循环中运行,每执行一次,getopts就检查下一个命令行参数,并判断它是否有效。(即检查参数是否以-开头,后面跟一个包含在opstring中的字母)。
      有效,则把匹配的选项字母存在指定的变量variable中,并返回退出状态0(ture);
      无效(如果-后面的字母没有包含在options),就在 variable 中存入一个?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以-开头,就返回不为0的退出状态(false, 可用于结束while 循环)。
     getopts处理完所有参数后,会返回一个非0值(false,退出循环),此时OPTIND索引值指向第一个非选项的参数[args],name置为?

    getopts 错误处理
      正确使用命令时,name用来存储option, $OPTARG用来存放option的参数。若命令输入有误(选项无效,缺少参数),getopts会处理illegal option错误和miss option argument错误。处理结果与opstring是否以:开头而不同。opstring 开头的:用于屏蔽getopts处理时的错误消息(脚本中将OPTERR置于0也可以达到同样的效果)。

    [python@master tmp]$ more getopts.sh 
    #!/bin/bash
    while getopts u:p:n option
    do 
        case "$option" in
            u)
                echo "option:u, value $OPTARG"
                echo "next arg index:$OPTIND";;
            p)
                echo "option:p"
                passwd=$OPTARG
                echo "next arg index:$OPTIND"
                echo "PASSWD IS: $passwd";;
            n)
                echo "option:N"
                echo "next arg index:$OPTIND";;
            ?)
                echo "Usage: args [-U] [-p] [-n]"
                echo "-u means uses"
                echo "-p means passwd"
                echo "-n means name"
                exit 1;;
        esac
    done

     

    运行:

    [python@master tmp]$ sh getopts.sh -u root -p root_123 -n zhangwei
    option:u, value root
    next arg index:3
    option:p
    next arg index:5
    PASSWD IS: root_123
    option:N
    next arg index:6

    注:

    1.getopts 允许把选项堆叠在一起(如 -ms)

    2.如要带参数,须在对应选项后加 :(如h后需加参数 h:ms)。此时选项和参数之间至少有一个空白字符分隔,这样的选项不能堆叠。

    3.如果在需要参数的选项之后没有找到参数,它就在给定的变量中存入 ? ,并向标准错误中写入错误消息。否则将实际参数写入特殊变量 :OPTARG

    4.另外一个特殊变量:OPTIND,反映下一个要处理的参数索引,初值是 1,每次执行 getopts 时都会更新。

     

     

  • 相关阅读:
    第07组 Alpha冲刺 (2/6)
    第07组Alpha冲刺(1/6)
    第四次作业
    面试题练习
    SpringMVC访问静态资源
    MyBatis基础
    Spring注解和jdk注解
    自动代理生成器
    aspect xml
    Spring-案例
  • 原文地址:https://www.cnblogs.com/hello-wei/p/9778407.html
Copyright © 2011-2022 走看看