Linux shell命令行可选参数的getopts命令使用例子

Linux shell命令行可选参数的getopts命令使用例子

一、概述

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

getopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现
在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。
getopts还包含两个内置变量,及OPTARG和OPTIND
OPTARG 就是将选项后面的参数(或者描述信息DESCPRITION)保存在此变量当中。
OPTIND 这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)

while getopts ":a:bc:" opt
第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数。
$OPTARG 存储相应选项的参数,如下例中的11、5;
$OPTIND 总是存储原始$*中下一个要处理的选项(不是参数,而是选项,此处指的是a,b,c这三个选项,而不是那些数字,当然数字
也是会占有位置的)位置。
optind初值为1,遇到"x",选项不带参数,optind+=1;遇到"x:",带参数的选项,optarg=argv[optind+1],optind+=2;

二、shell的getopts命令举例

$ vim getopts.sh

#!/bin/bash
echo $*
a_value='-1'
b_value='-1'
c_value='-1'
para_num=$#
usage() {
    echo -e "Usage:\n  $0 -a 'username' [-b '0.2'] [-c 0]" 1>&2
    exit 1
}
if [[ ${para_num} -lt 1 ]]; then
    echo "参数个数不够,请按照如下格式传入参数"
    usage
    exit 1
fi
while getopts ":a:b:c:" opt
do
    case $opt in
        a)
        a_value=$OPTARG
        echo "a_value: ${a_value}"
        echo $OPTARG $OPTIND;;
        b)
        b_value=$OPTARG
        echo "b_value: ${b_value}"
        echo "b $OPTIND";;
        c)
        c_value=$OPTARG
        echo "c_value: ${c_value}"
        echo "c $OPTIND";;
        ?)
        error_value=$OPTARG
        echo "error_value: ${error_value}"
        usage;;
    esac
done
echo "***********"
echo "a_value: ${a_value}"
echo "b_value: ${b_value}"
echo "c_value: ${c_value}"

1、执行:$ bash ./getopts.sh -a a11 -b b55  -c cc66
结果:

-a a11 -b b55 -c cc66
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
***********
a_value: a11
b_value: b55
c_value: cc66

解释:
第一行输出echo $*
第三行,optind初值为1,选项-a的参数为a11,下一个要处理的选项-b位置为3(即OPTIND=3),所以输出:a11 3;
第五行,然后-b要处理的下一个选项-c位置为5,所以输出:b 5;
第七行,再者-c有参数,所以下一个要处理的位置+2(即为7,照着所有参数也数的出来下一个参数即为7,因为如果有下一个参数那么一定是在参数值5之后的),所以输出:c 7;
其中,第二行、第四行、第六行是具体参数的值
注:选项参数的格式必须是 -d val,而不能是中间没有空格的-dval  【如-d 10 不能是-d10】
    getopts是对脚本参数的校验

2、执行:$ bash ./getopts.sh  -a a11 -b b55 

结果为:

 -a a11 -b b55
a_value: a11
a11 3
b_value: b55
b 5
***********
a_value: a11
b_value: b55
c_value: -1

3、执行:$ bash ./getopts.sh -a a11 

-a a11
a_value: a11
a11 3
***********
a_value: a11
b_value: -1
c_value: -1

4、执行:$ bash ./getopts.sh

参数个数不够,请按照如下格式传入参数
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

5、执行:$ bash ./getopts.sh -a a11 -b b55  -c cc66 -dvv

-a a11 -b b55 -c cc66 -dvv
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

6、执行:$ bash ./getopts.sh -a a11 -dvv -b b55

-a a11 -dvv -b b55
a_value: a11
a11 3
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

参考: https://www.jianshu.com/p/baf6e5b7e70a

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页