shell里的getopts

https://www.cnblogs.com/yinghao1991/p/7123550.html

https://www.cnblogs.com/xupeizhi/archive/2013/02/18/2915659.html

在写sh脚本的时候,常常需要运行时输入一些数据。基本的$*,执行的情况,大概就是$0 $1 $2 $3…… 那么,那些系统命令里的参数又是怎么做出来的呢?我们自己的脚本如何搞出来$0-$1的效果呢?这就是getopts的作用了。举例如下:

#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
do
    case "$optname" in
    "p")
        echo "Option $optname is specified"
        ;;
    "q")
        echo "Option $optname has value $OPTARG"
        ;;
    "?")
        echo "Unknown option $OPTARG"
        ;;
    ":")
        echo "No argument value for option $OPTARG"
        ;;
    *)
        # Should not occur
        echo "Unknown error while processing options"
        ;;
    esac
echo "OPTIND is now $OPTIND"
done

在使用getopts命令的时候,shell会自动产生两个变量OPTIND和OPTARG。

OPTIND初始值为1,其含义是下一个待处理的参数的索引。只要存在,getopts命令返回true,所以一般getopts命令使用while循环;

OPTARG是当getopts获取到其期望的参数后存入的位置。而如果不在其期望内,则$optname被设为?并将该意外值存入OPTARG; 如果$optname需要拥有具体设置值而实际却没有,则$optname被设为:并将丢失设置值的optname存入OPTARG;

对于$optname,可以用后标:来表示是否需要值;而前标:则表示是否开启静默模式。

getopts是shell的一个内置命令。

概述

getopts optstring name [args]
OPTIND,OPTARG,OPTERR

描述

getopts被shell程序用来分析位置参数,optstring包含需要被识别的选项字符,如果这里的字符后面跟着一个冒号,表明该字符选项需要一个参数,其参数需要以空格分隔。冒号和问号不能被用作选项字符。getopts每次被调用时,它会将下一个选项字符放置到变量name中。

变量OPTIND是下一个要被处理的位置参数的索引,初始值为1。shell不会自动的复位OPTIND,如果想再次对位置参数进行分析,则需要手动对OPTIND进行复位。当选项需要参数时,getopts将参数放置在变量OPTARG中。

当所有的位置参数分析结束,getopts退出并返回一个大于0的值,OPTIND变为首个不是选项的位置参数的索引,name被置为'?'。默认情况下getopts会去分析传入的位置参数,但如果args有值,则只会分析args里的参数,args只支持形如-abc形式。

如果遇到错误,getopts会打印出错误信息,但如果optstring第一个字符是冒号,或者变量OPTERR被置为0(此项只是不打印错误信息,不会在出错后设置OPTARG的值),则会进入静默模式,不会打印错误信息。遇到的错误通常有两种情况:
1、无效的选项,此时name会被置为'?'。静默模式下,会将此无效选项置于OPTARG。非静默模式,打印错误信息,并且unset OPTARG。
2、选项需要的参数未提供,静默模式下,name会被置为':',无效选项会置于OPTARG。非静默模式,name被置为'?',unset OPTARG并打印出错信息。

解释

https://blog.csdn.net/wh211212/article/details/53750366

1):a:b:c: 意思是-a -b -c 都需要参数值是静默模式有错误不显示

2)ab:c: 意思是-a不是必须需要参数值,但是-b、-c是必须需要参数值的 且非静默模式

3)ab:cd   optstring定义了四个有效选项字母:a,b,c,d.冒号(:)被放在了字母b后面,因为b选项需要一个参数值,当getopt命令运行时,它会检查提供的参数列表(-a -b test1 -cd test2 test3),并给予提供的optstring进行解析,它会自动讲-cd选项分成两个单独的选项,并插入双破折线来分割行中的额外参数。

getopts如果遇到一个选项(无论是否有效),返回true(0)。如果遇到结束或者产生错误,返回false

示例

示例来自参考【2】

#!/bin/sh
while getopts :ab:c: OPTION;do
    case $OPTION in
    a)echo "get option a"
    ;; 
    b)echo "get option b and parameter is $OPTARG"
    ;; 
    c)echo "get option c and parameter is $OPTARG"
    ;; 
    ?)echo "get a non option $OPTARG and OPTION is $OPTION"
    ;; 
    esac
done

一个运行实例

其中,-a和-b是正确的选项,-p和-c分别对应错误选项的两种情况。

猜你喜欢

转载自blog.csdn.net/michaelwubo/article/details/81079379