码迷,mamicode.com
首页 > 系统相关 > 详细

shell脚本之getopts的使用方法

时间:2017-10-19 19:53:00      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:shell getopts

遇到shell脚本需要收集参数场景,用getopts非常的方便


getopts optstring name [arg...]     例如:getopts "a:fs" OPTION


命令描述:


optstring列出了对应的Shell Script可以识别的所有参数。比如,如果 Shell Script可以识别-a,-f以及-s参数,则optstring就是afs,默认可以不跟值,如果对应的参数后面还跟随一个值,则在相应的optstring后面加冒号。

比如,a:fs 表示a参数后面会有一个值出现,-a value的形式。

另外,getopts执行匹配到a的时候,会把value存放在一个叫OPTARG的Shell Variable当中。

如果 optstring是以冒号开头的,命令行当中出现了optstring当中没有的参数将不会提示错误信息。比如出现没有定义的-x不会报"illegal option -- x"

name表示的是参数的名称,每次执行getopts,会从命令行当中获取下一个参数,然后存放到name当中。如果获取到的参数不在optstring当中列出, 则name的值被设置为?。

命令行当中的所有参数都有一个index,第一个参数从1开始,依次类推。 另外有一个名为OPTIND的Shell Variable存放下一个要处理的参数的index。

注意:optstring 的参数可以在脚本中全部传入,或者不传入



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


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


3、$optind 总是存储原始$*中下一个要处理的元素(不是参数,而是选项)的位置;


optind初值为1,遇到"x",选项不带参数,optind += 1 ;遇到“x:”,带参数的选项,optind += 2;遇到“x::”,可选参数,属于#1和#2之一,GNU扩展实现。

上例中-a参数的位置为1,由于后面有参数11 ,后面需要处理的下一个参数-b的位置为3,所认此出输出

3;同理-f要处理的下一个参数为-s,值为4,-s后面有参数+2,后面要处理的参数为位置为6。


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

a.选项参数的格式必须是-d val,而不能是中间没有空格的-dval。

b.所有选项参数必须写在其它参数的前面,因为 getopts 是从命令行前面开始处理,遇到非-开头的参数,或者选项参数结束标记--就中止了,如果中间遇到非选项的命令行参数,后面的选项参数就都取不到了。

c.不支持长选项, 也就是--debug 之类的选项

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


cat getopts.sh

#!/bin/bash
echo $@  参数列表
while getopts  "a:bc:" opt
do
    case $opt in 
a)
           echo "a $OPTARG $OPTIND"
           ;;
         b)
           echo "b  $OPTIND"  #-b后面不要跟参数,否则遇到非选项命令行参数,会结束
           ;;
         c)
           echo "c $OPTARG $OPTIND"
           ;;
         ?)           #没有的参数,会被存储在?中
          echo "error"
         exit
      esac
done
echo $OPTIND #下一个要处理的参数的位置号
shift $(( $OPTIND-2 ))  #移除前4个
echo $0   #脚本名
echo $*   #参数列表
------------
-a 11 -b -c 6
a 11 3
b  4
c 6 6
6
./getopts.sh
6




本文出自 “小鱼的博客” 博客,谢绝转载!

shell脚本之getopts的使用方法

标签:shell getopts

原文地址:http://395469372.blog.51cto.com/1150982/1974272

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!