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


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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...