【问题标题】:parse arguments after getopts在 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

【问题讨论】:

    标签: bash command-line-arguments arguments getopts


    【解决方案1】:

    你可以这样做:

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

    循环运行后。

    【讨论】:

    【解决方案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"
    

    【讨论】: