разбирать аргументы после getopts - PullRequest
25 голосов
/ 28 февраля 2012

Я хочу вызвать 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?

Ответы [ 2 ]

41 голосов
/ 28 февраля 2012

Вы можете сделать что-то вроде:

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

после запуска цикла.

7 голосов
/ 08 октября 2018

Чтобы захватить все оставшиеся параметры после обработки 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"
...