在 getopts 之后解析参数

Posted

技术标签:

【中文标题】在 getopts 之后解析参数【英文标题】:parse arguments after getopts 【发布时间】:2012-03-17 09:20:50 【问题描述】:

我想调用这样的 bash 脚本

$ ./scriptName -o -p -t something path/to/file

据我所知

#!/bin/bash

o=false
p=false

while getopts ":opt:" options
do
    case $options in
        o ) opt1=true
        ;;
        p ) opt2=true
        ;;
        t ) opt3=$OPTARG
        ;;
    esac
done

但是我如何获得path/to/file

【问题讨论】:

【参考方案1】:

你可以这样做:

shift $(($OPTIND - 1))
first_arg=$1
second_arg=$2

循环运行后。

【讨论】:

第一行可以写成shift $((OPTIND - 1)) - 即在括号内去掉美元符号吗? Armand,所以看起来像:tldp.org/LDP/abs/html/arithexp.html【参考方案2】:

要捕获getopts处理后的所有剩余参数,一个好的解决方案是shift(删除)所有处理过的参数(变量$OPTIND)并将剩余的参数($@)分配给特定的多变的。 简短回答:

shift $(($OPTIND - 1))
remaining_args="$@"

长示例:

#!/bin/bash

verbose=false

function usage () 
    cat <<EOUSAGE
$(basename $0) hvr:e:
    show usage
EOUSAGE


while getopts :hvr:e: opt
do
    case $opt in
        v)
            verbose=true
            ;;
        e)
            option_e="$OPTARG"
            ;;
        r)
            option_r="$option_r $OPTARG"
            ;;
        h)
            usage
            exit 1
            ;;
        *)
            echo "Invalid option: -$OPTARG" >&2
            usage
            exit 2
            ;;
    esac
done


echo "Verbose is $verbose"
echo "option_e is \"$option_e\""
echo "option_r is \"$option_r\""
echo "\$@ pre shift is \"$@\""
shift $((OPTIND - 1))
echo "\$@ post shift is \"$@\""

这将输出

$ ./test-getopts.sh -r foo1 -v -e bla -r foo2 remain1 remain2
Verbose is true
option_e is "bla"
option_r is " foo1 foo2"
$@ pre shift is "-r foo1 -v -e bla -r foo2 remain1 remain2"
$@ post shift is "remain1 remain2"

【讨论】:

以上是关于在 getopts 之后解析参数的主要内容,如果未能解决你的问题,请参考以下文章

Linux getopt/getopts解析命令行参数教程

命令行参数解析函数getopt和getopt_long函数

getopt 不将可选参数解析为参数

getopt-解析命令行参数

参数解析函数getopt

PHP使用getopt()解析cli参数