Несколько аргументов параметров с использованием getopts в bash

Несколько аргументов параметров с использованием getopts в bash

Я пытаюсь обработать аргументы командной строки, используя getoptsв bash. Одним из требований является обработка произвольного количества аргументов опций (без использования кавычек).

1-й пример (захватывает только 1-й аргумент)

madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a

2-й пример (я хочу, чтобы он вел себя так, но без необходимости цитировать аргумент)

madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c

Есть ли способ сделать это?

Вот какой код у меня сейчас:

#!/bin/bash
while getopts ":s:" opt; do
    case $opt in
    s) echo "-s was triggered" >&2
       args="$OPTARG"
       echo "Argument: $args"
       ;;
       \?) echo "Invalid option: -$OPTARG" >&2
       ;;
    :) echo "Option -$OPTARG requires an argument." >&2
       exit 1
       ;;
    esac
done

Обратите внимание, что таким образом я хочу поддерживать несколько флагов, например:

madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4

решение1

Я думаю, что лучший способ — использовать -s для каждого аргумента, -s foo -s bar -s bazт.е.ноесли вы все еще хотите поддержать несколько аргументов в пользу одного варианта, я предлагаю вамнетиспользовать getopts.

Пожалуйста, взгляните на следующий скрипт:

#!/bin/bash

declare -a sargs=()

read_s_args()
{
    while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}

while (($#)); do
    case "$1" in
        -s) read_s_args "${@:2}"
    esac
    shift
done

printf '<%s>' "${sargs[@]}"

При -sобнаружении read_s_argsвызывается с оставшимися опциями и аргументами в командной строке. read_s_argsсчитывает свои аргументы, пока не дойдет до следующей опции. Допустимые аргументы для -s сохраняются в sargsмассиве.

Вотпример вывода:

[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]

Связанный контент