zoukankan      html  css  js  c++  java
  • [shell] 脚本之shift和getopts (转载)

    转载地址:http://www.361way.com/shell-shift-getopts/4973.html

    建议不熟悉getopts的朋友,此篇要看完,getopts部分内容在原作者上面有改动。

    一、shift参数的使用

    很多脚本执行的时候我们并不知道后面参数的个数,但可以使用$*来获取所有参数。但在程序处理的过程中有时需要逐个的将$1、$2、$3……$n进行处理,shift命令的作用就是在执行完$1后,将$2变为$1,$3变为$2,依次类推。

    [root@localhost ~]# cat shift.sh 
    #!/bin/bash
    until [ $# -eq 0 ]
    do
            echo "第一个参数为: $1 参数个数为: $#"
            shift
    done
    

    执行结果如下:

    [root@localhost ~]# sh shift.sh 1 2 3 4 
    第一个参数为: 1 参数个数为: 4
    第一个参数为: 2 参数个数为: 3
    第一个参数为: 3 参数个数为: 2
    第一个参数为: 4 参数个数为: 1
    

    以上内容简单过一下shift的用法

    二、getopts参数的使用

    [root@localhost ~]# cat getopts.sh 
    #!/bin/bash
    echo $*
    while getopts ":a:bc:" opt
    do
        case $opt in
            a)
            echo $OPTARG $OPTIND;;
            b)
            echo "b $OPTIND";;
            c)
            echo "c $OPTIND";;
            ?)
            echo "error"
            exit 1;;
        esac
    done
    echo $OPTIND
    shift $(( $OPTIND-1 ))
    echo $0
    echo $*
    

    执行结果如下:

    [root@localhost ~]# sh getopts.sh -a 11 -b -c 6 
    -a 11 -b -c 6
    11 3
    b 4
    c 6
    6
    getopts.sh

    为什么会得到上面的结果呢?

    while getopts ":a:bc:" opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数。

    $optarg 存储相应选项的参数,如上例中的11、6;

    $optind 总是存储原始$*中下一个要处理的选项(不是参数,而是选项,此处指的是a,b,c这三个选项,而不是那些数字,当然数字也是会占有位置的)位置。

    optind初值为1,遇到"x",选项不带参数,optind+=1;遇到"x:",带参数的选项,optarg=argv[optind+1],optind+=2;遇到"x::",可选参数,属于#1和#2之一(转载过来的,这句我也看不懂)

    第一行输出echo $*

    第二行,optind初值为1,选项-a的参数为11,下一个要处理的选项-b位置为3,所以输出:11 3;

    第三行,然后-b要处理的下一个选项-c位置为4,所以输出:b 4;

    第四行,再者-c有参数,所以下一个要处理的位置+2,所以输出:c 6;

    自己随手输入的例子:

    [root@localhost ~]# sh getopts.sh -a 11 -b -b 9 -c 6
    -a 11 -b -b 5 -c 6
    11 3
    b 4
    b 5
    5
    getopts.sh
    9 -c 6
    

    起初我看到以上的输出结果百思不得其解,后面多试几次选项及参数后,大概猜了一下。

    第一行输出echo $*

    第二行,optind初值为1,下一个要处理的选项-b位置为3,所以输出11 3;

    第三行,下一个要处理的选项-b位置为4,所以输出b 4;

    第四行,下一个要处理的选项-b位置为5,所以输出b 5;

    程序现在遇到9,不属于getopts,所以停止循环while,下面几行就不解释了。

    至于getopts的局限,建议跳转原作者博客尾处。

    http://www.361way.com/shell-shift-getopts/4973.html

  • 相关阅读:
    [转载]Quartus ii 一些Warning/Eeror分析与解决
    [转载]MAC、IP头、TCP头、UDP头帧格式、详解
    [转载]关于晶振ppm
    20140919-FPGA-有效观察设计中的差分信号
    [转载]转一篇Systemverilog的一个牛人总结
    [转载]ISE中COE与MIF文件的联系与区别
    linux系统性能监控--I/O利用率
    linux系统性能监控--内存利用率
    linux系统性能监控--CPU利用率
    在linux系统中I/O 调度的选择
  • 原文地址:https://www.cnblogs.com/hjfeng1988/p/6875201.html
Copyright © 2011-2022 走看看