[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

原文地址:https://www.cnblogs.com/hjfeng1988/p/6875201.html