getopt命令解析shell脚本命令行选项教程

发布时间:2020-03-04编辑:脚本学堂
有关shell中用getops命令解析命令行选项的用法,shell内置的getopts命令也可以处理shell脚本选项和参数,这里比较下二者的异同,需要的朋友参考下。

之前介绍过shell内置的getopts命令处理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命令不同,它实际上是通过将参数规范化来帮助我们处理的。

shell脚本:
 

复制代码 代码示例:

#!/bin/bash
#echo $@

#-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`
if [ $? != 0 ]; then
    echo "Terminating..."
    exit 1
fi

#echo $ARGS
#将规范化后的命令行参数分配至位置参数($1,$2,...)
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

注意,像上面的-c选项,后面是可接可不接参数的,如果需要传递参数给-c选项,则必须使用如下方式:
 

复制代码 代码示例:
#./getopt.sh -b 123 -a -c456 file1 file2
Option b, argument 123
Option a
Option c, argument 456
processing file1
processing file2
#./getopt.sh --blong 123 -a --clong=456 file1 file2 
Option b, argument 123
Option a
Option c, argument 456
processing file1
processing file2