shell脚本之shift和getopts

在系统服务和一些其他脚本中都可以看到shift和getopts参数的使用,尤其是前者。本篇就针对两者在linux shell 下的使用做下小结。

一、shift参数的使用

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

例1:

 
 
  1. [root@361way bash]# cat shift.sh
  2. #!/bin/bash
  3. until [ $# -eq 0 ]
  4. do
  5. echo "第一个参数为: $1 参数个数为: $#"
  6. shift
  7. done

执行结果如下:

 
 
  1. [root@361way bash]# sh shift.sh 1 2 3 4
  2. 第一个参数为: 1 参数个数为: 4
  3. 第一个参数为: 2 参数个数为: 3
  4. 第一个参数为: 3 参数个数为: 2
  5. 第一个参数为: 4 参数个数为: 1

例2:

 
 
  1. [root@361way bash]# cat shift1.sh
  2. until [ -z "$1" ] # Until all parameters used up
  3. do
  4. echo "$@ "
  5. shift
  6. done

执行结果如下:

 
 
  1. [root@361way bash]# sh shift1.sh 1 2 3 4 5 6
  2. 1 2 3 4 5 6
  3. 2 3 4 5 6
  4. 3 4 5 6
  5. 4 5 6
  6. 5 6
  7. 6

二、getopts参数的使用

先看一个示例:

 
 
  1. #!/bin/bash
  2. echo $*
  3. while getopts ":a:bc:" opt
  4. do
  5. case $opt in
  6. a)
  7. echo $OPTARG
  8. echo $OPTIND
  9. ;;
  10. b)
  11. echo "b $OPTIND"
  12. ;;
  13. c)
  14. echo "c $OPTIND"
  15. ;;
  16. ?)
  17. echo "error"
  18. exit 1
  19. esac
  20. done
  21. echo $OPTIND
  22. shift $(( $OPTIND-1 ))
  23. echo $0
  24. echo $*

上面这个脚本后面传参后执行结果如下:

 
 
  1. # ./getopts.sh -a 11 -b -c 6
  2. -a 11 -b -c 6
  3. 11
  4. 3
  5. b 4
  6. c 6
  7. 6

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

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之一,GNU扩展实现。

上例中-a参数的位置为1,由于后面有参数11 ,后面需要处理的下一个参数-b的位置为3,所认此出输出3;同理-b要处理的下一个参数为-c ,值为4,-c后面有参数+2,后面要处理的参数为位置为6。

使用 getopts 处理参数虽然是方便,但仍然有两个小小的局限:

  • 选项参数的格式必须是-d val,而不能是中间没有空格的-dval。
  • 所有选项参数必须写在其它参数的前面,因为 getopts 是从命令行前面开始处理,遇到非-开头的参数,或者选项参数结束标记--就中止了,如果中间遇到非选项的命令行参数,后面的选项参数就都取不到了。
  • 不支持长选项, 也就是--debug 之类的选项

由getopts为bash内置的一个参数,如果想要使用更强大的功能可以使用系统下的另一个单独命令getopt,这个单独再做一篇来讲述。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值