一、getopts命令简介

getopts命令是用来解析Shell脚本命令行参数的工具,getopts命令参数包含需要被识别的选项字符,如果选项字符后面跟着一个冒号,则表明该字符选项需要一个命令行参数(选项字符与对应的命令行参数之间以空格分隔)(注意:冒号&问号不能被用作为选项字符)。getopts命令每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误

1.1 命令使用格式

getopts optstring name [arg...]
  1. optstring列出了对应的Shell脚本可以识别的所有参数,例如:需要使用-a,-f,-s参数时,optstring是afs;如果需要命令行参数后面还跟随一个值,则在相应的optstring后面加冒号,例如a:fs 表示a命令行参数后面会有一个值,是**-a value**的形式;
  2. getopts执行时若匹配到a参数,会把-a参数对应的value存放在一个叫OPTARGShell Variable中;
  3. 如果optstring是以冒号开头,则表明当命令行出现了optstring中没有的参数将不会提示错误信息

二、示例

在Shell脚本中,对于简单的参数,常常会使用$1,2 , . . . , n来处理即可。但当命令行参数过多或者我们需要区分命令行参数用途时,就需要使用getopts命令

2.1

#!/bin/bash

func() {
    echo "Usage:"
    echo "test.sh [-j S_DIR] [-m D_DIR]"
    echo "Description:"
    echo "S_DIR,the path of source."
    echo "D_DIR,the path of destination."
    exit -1
}

upload="false"

while getopts 'h:j:m:u' OPT; do
    case $OPT in
        j) S_DIR="$OPTARG";;
        m) D_DIR="$OPTARG";;
        u) upload="true";;
        h) func;;
        ?) func;;
    esac
done

echo $S_DIR
echo $D_DIR
echo $upload

情况1:

sh test.sh -j /data/usw/web -m /opt/data/web
##输出结果
/data/usw/web
/opt/data/web
false

情况2:
getopts命令的选项字符中,如果是没有跟随 : 的字母就是开关型选项,不需要指定值,等同于true/false,只要带上了这个参数就是true。如下示例中的 -u

getopts命令识别出各个选项之后,就可以配合case进行操作。操作中,有两个"常量",一个是OPTARG,用来获取当前选项的值;另外一个就是OPTIND,表示当前选项在参数列表中的位移。case的最后一项是?,是用来识别非法的选项,并进行相应的操作,我们的脚本中是输出了帮助信息

sh test.sh -j /data/usw/web -m /opt/data/web -u
##输出结果
/data/usw/web
/opt/data/web
true

情况3:

sh test.sh -h
##输出结果
test.sh: option requires an argument -- h
Usage:
test.sh [-j S_DIR] [-m D_DIR]
Description:
S_DIR,the path of source.
D_DIR,the path of destination.

情况4:

sh test.sh j
##输出结果


false

2.2

#!/bin/bash

func() {
    echo "func:"
    echo "test.sh [-j S_DIR] [-m D_DIR]"
    echo "Description:"
    echo "S_DIR, the path of source."
    echo "D_DIR, the path of destination."
    exit -1
}

upload="false"

echo $OPTIND

while getopts 'j:m:u' OPT; do
    case $OPT in
        j) S_DIR="$OPTARG";;
        m) D_DIR="$OPTARG";;
        u) upload="true";;
        ?) func;;
    esac
done

echo $OPTIND
shift $(($OPTIND - 1))
echo $1

情况1:

sh test.sh -j /data/usw/web beijing
##输出结果
1
3
beijing

情况2:

sh test.sh -m /opt/data/web beijing
1
3
beijing

情况3:

sh test.sh -j /data/usw/web -m /opt/data/web beijing
1
5
beijing

情况4:

sh test.sh -j /data/usw/web -m /opt/data/web -u beijing
1
6
beijing
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐