使用getopt命令解析shell脚本的命令行选项

本文将要介绍的是getopt命令,它可以同时处理短选项和长选项。

首先,getopt命令不是一个标准的unix命令,但它在大多数Linux的发行版中都自带了有,如果没有,也可以从getopt官网上下载安装。

在getopt的较老版本中,存在一些bug,不大好用,在后来的版本中解决了这些问题,我们称之为getopt增强版。通过-T选项,我们可以检查当前的getopt是否为增强版,返回值为4,则表明是增强版的。

#getopt -T
#echo $?
4
#getopt -V
getopt (enhanced) 1.1.4

getopt命令与getopts命令不同,它实际上是通过将参数规范化来帮助我们处理的。具体的用法,如下面的脚本:

#!/bin/bash
#echo $@
 
#-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
#下面这行命令可以理解为:检查脚本的参数并且规范化。
#首先是如何检查,它规定了脚本只接受6个选项和一些参数。支持短选项和长选项两种类型。
#每个选项都可以出现或者不出现,短选项a,b,c分别对应了长选项--along,--blong和--clong。
#先说一下短选项,其中a选项出现时不需要参数,因为a后面什么都没有。b选项出现时必须要有参数,
#因为b选项后面有一个:,c选项出现时可以有参数也可以没有参数,因为c选项后面有两个:。
#c选项有参数时格式是固定的,必须为-carg这种。而b选项格式可以是-b arg或者-barg两种格式。
#长选项和短选项的格式稍微有些区别,c选项有参数时格式是--clong=arg。b选项的格式可以是
#--blong=arg 或 --blong arg 或 --blongarg等格式。
#除了这6个选项,如果传入的参数出现其他的选项,命令会报错。选项的格式不对也会报错。
#规范化主要是会调整选项和参数的顺序,例如,参数为a,b arg1,arg2,arg3,c
#经过getopt命令后,顺序变为:a,b arg1,c,arg2,arg3其中arg1为选项b的参数。把选项c的位置调整到
#参数arg2的前面了,所有的参数都调整到选项后面。
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`
if [ $? != 0 ]; then
    echo "Terminating..."
    exit 1
fi
 
echo "调用getopt命令后ARGS参数为:"$ARGS
echo '当前脚本的$@参数为:'$@
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
echo '调用eval set命令后将ARGS分配给$@后,$@参数为:'$@
 
while true
do
    case "$1" in
        -a|--along) 
            echo "Option a";
            shift
            ;;
        -b|--blong)
            echo "Option b, argument $2";
            shift 2
            ;;
        -c|--clong)
            case "$2" in
                "")
                    echo "Option c, no argument";
                    shift 2  
                    ;;
                *)
                    echo "Option c, argument $2";
                    shift 2;
                    ;;
            esac
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Internal error!"
            exit 1
            ;;
    esac
done
 
#处理剩余的参数
for arg in $@
do
    echo "processing $arg"
done

 

你可能感兴趣的:(shell,linux)