遇到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
catgetopts.sh
#!/bin/bash echo$@参数列表 whilegetopts"a:bc:"opt do case$optin 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$*#参数列表 ------------ -a11-b-c6 a113 b4 c66 6 ./getopts.sh 6