Linux 使用getopts命令获取命令行参数

来源:互联网 发布:电压力锅 知乎 编辑:程序博客网 时间:2024/06/04 19:26

Linux getopts命令用于获取命令行中的参数

调用格式:

getopts option_string variable

 
参数说明:
option_string 选项名称
variable 选项的值
 
选项之间使用冒号:分隔,也可以直接连接, : 表示选项后面有传值。
当getopts命令发现冒号后,会从命令行该选项后读取该值。如该值存在,将保存在特殊的变量OPTARG中。

当option_string用:开头,getopts会区分invalid option错误和miss option argument错误。

invalid option时, varname会被设成?
miss option argument时,varname会被设成:

如果option_string不用:开头,invalid option错误和miss option argument错误都会使varname被设成?。


getopts包含两个内置变量,OPTARGOPTIND

OPTARG 保存选项后的参数值
OPTIND 表示命令行下一个选项或参数的索引

例子1,使用getopts命令获取参数

#!/bin/bashwhile getopts a:b:c:d opts; do    case $opts in        a) a=$OPTARG ;;        b) b=$OPTARG ;;        c) c=$OPTARG ;;        d) d=$OPTARG ;;        ?) ;;    esacdoneecho "a=$a"echo "b=$b"echo "c=$c"echo "d=$d"exit 0

执行输出

./test.sh -a 1 -b 2 -c 3 -d 4a=1b=2c=3d=

option_string a:b:c:d
a,b,c后都有:,d后没有:
所以可以获取到a,b,c的值

例子2,option_string前加:

上例中,如果a,b,c任意一个没有传值,将会提示出错。例如 -c 不传值。

./test.sh -a 1 -b 2 -c./test.sh: option requires an argument -- ca=1b=2c=d=

我们在option_string前加上:,则可以屏蔽这个错误。

#!/bin/bashwhile getopts :a:b:c:d opts; do    case $opts in        a) a=$OPTARG ;;        b) b=$OPTARG ;;        c) c=$OPTARG ;;        d) d=$OPTARG ;;        ?) ;;    esacdoneecho "a=$a"echo "b=$b"echo "c=$c"echo "d=$d"exit 0

执行输出

./test.sh -a 1 -b 2 -ca=1b=2c=d=

在option_string前加上:,可以屏蔽缺失传值的错误,但如果缺失的是前面选项的值,那么获取到的值将会错误。

例如缺失a的传值,命令会把-a后的-b作为了-a的值,导致错误。

./test.sh -a -b 2 -c 3a=-bb=c=d=

因此使用getopts命令时,对于没有传值的选项,选项名称也不要加入命令行中。
例如a不传值,则-a不要加入命令行。

./test.sh -b 2 -c 3a=b=2c=3d=



Linux的getopts命令并不支持多个字符组合的参数名称(longopts),如需要获取long opts参数,可以使用php的getopt方法实现,参考:《php cli模式下获取参数的方法》