Shell中getopts用法介绍

30 篇文章 7 订阅

一、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
  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值