Linux 每日一命令 - 获取命令行参数命令(getopts)

in Linux with 0 comment

getopts的使用

1. 使用场景

getopts 是linux系统中的一个内置变量,一般用在循环中。每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。

2. 命令语法

语法

getopts [option[:]] [DESCPRITION] VARIABLE
option:表示为某个脚本可以使用的选项
":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中

此命令包含两个内置变量,及OPTARG和OPTIND

OPTARG:将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中
OPTIND:表示命令行的下一个选项或参数的索引(文件名不算选项或参数)

#!/bin/bash
while getopts ':b:d:' OPT &> /dev/null;do
        case $OPT in
        b)
                echo "The options is b"
                echo $OPTARG ;;
        d)
                echo "The options is d"
                echo $OPTARG ;;
        *)
                echo "Wrong Options"
                exit 7 ;;
        esac
#       echo $OPT
#       echo $OPTARG
done
echo $OPTIND
shift $[$OPTIND-1]
echo $1

执行脚本时,显示的结果如下

[root@localhost ~]# ./test -d 'nice' fixnale
The options is d  
nice
3
fixnale

显示信息说明如下

当输入 -d 时,$OPT=d,$OPTARG='nice',因此就会显示d)...这一部分的信息。
由于这里有一个选项(-d)和一个参数('nice'),$OPTIND指向命令行中下一个选项或参数的索引位置,因此这里即为3。
shift $[$OPTIND-1]表示将文件名前面的选项和参数踢掉

3. 使用实例

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

#!/bin/bash
while getopts a:b:c:d opts; do
    case $opts in
        a) a=$OPTARG ;;
        b) b=$OPTARG ;;
        c) c=$OPTARG ;;
        d) d=$OPTARG ;;
        ?) ;;
    esac
done

echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"

exit 0

执行输出

[root@domain ~]# bash test.sh -a 1 -b 2 -c 3 -d 4
a=1
b=2
c=3
d=

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

例子2:option_string前加:

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

[root@domain ~]# bash t.sh -a 1 -b 2 -c
t.sh: option requires an argument -- c
a=1
b=2
c=
d=

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

#!/bin/bash
while getopts :a:b:c:d opts; do
    case $opts in
        a) a=$OPTARG ;;
        b) b=$OPTARG ;;
        c) c=$OPTARG ;;
        d) d=$OPTARG ;;
        ?) ;;
    esac
done

echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"

exit 0

执行输出

bash test.sh -a 1 -b 2 -c
a=1
b=2
c=
d=

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

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

[root@domain ~]# bash t.sh -a -b 2 -c 3
a=-b
b=
c=
d=

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

[root@domain ~]# bash t.sh -b 2 -c 3   
a=
b=2
c=3
d=

回复