Vários argumentos de opção usando getopts no bash [duplicado]

3

Estou tentando processar argumentos de linha de comando usando getopts no bash. Um dos requisitos é o processamento de um número arbitrário de argumentos de opção (sem o uso de aspas).

1º exemplo (somente pega o 1º argumento)

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

2º exemplo (quero que ele se comporte assim, mas sem precisar citar o argumento "

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

Existe uma maneira de fazer isso?

Aqui está o código que tenho agora:

#!/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

Observe que desejo oferecer suporte a vários sinalizadores dessa maneira, por exemplo,

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
    
por user1117603 24.04.2013 / 10:09

1 resposta

3

Eu acho que o melhor caminho a seguir é usar -s para cada argumento, ou seja, -s foo -s bar -s baz , mas se você ainda quiser suportar vários argumentos para uma única opção, sugiro que você < strong> not use getopts .

Por favor, dê uma olhada no seguinte script:

#!/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[@]}"

Quando -s está sendo detectado, read_s_args é chamado com as opções e argumentos restantes na linha de comando. read_s_args lê seus argumentos até atingir a próxima opção. Argumentos válidos para -s estão sendo armazenados na matriz sargs .

Aqui está uma saída de amostra :

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