2013-04-24 16 views
6

Próbuję przetwarzać argumenty wiersza poleceń za pomocą getopts w bash. Jednym z wymagań jest przetwarzanie dowolnej liczby argumentów opcji (bez użycia cytatów).Wiele argumentów opcji za pomocą getopts (bash)

1-ty przykład (tylko chwyta 1st argumentu)

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

2-ty przykład (Chcę, żeby zachowywać się tak, ale bez konieczności przytoczyć argument”

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

Czy istnieje sposób, aby ? to zrobić

Oto kod mam teraz:

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

To może pomóc: http://stackoverflow.com/a/7530327/1983854 – fedorqui

+0

Więcej szczegółów jest konieczne. Jakie zachowanie chcesz uzyskać, podając 'getoptz.sh -s a -b c'? Czy argument -b ma wartość '-s', czy też' -' wskazuje nową opcję? –

+0

Powiązany, ale w żadnym wypadku nie duplikat, [Wywołanie różnych programów z różnymi opcjami i różnymi argumentami dla każdej opcji] (http://stackoverflow.com/questions/15442950/). Zasadniczo najlepiej jest stosować standardowe wytyczne interfejsu poleceń [Konwencje POSIX Utility] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html) –

Odpowiedz

3

Można samodzielnie analizować argumenty wiersza polecenia, ale polecenie getopts nie może zostać skonfigurowane do rozpoznawania wielu argumentów dla pojedynczej opcji. fedorqui's recommendation to dobra alternatywa.

Oto jeden ze sposobów analizowania opcję siebie:

while [[ "$*" ]]; do 
    if [[ $1 = "-s" ]]; then 
     # -s takes three arguments 
     args="$2 $3 $4" 
     echo "-s got $args" 
     shift 4 
    fi 
done 
+0

Rzeczywiście, "rozpoznawać wiele argumentów dla pojedynczej opcji" nie jest możliwe, ale opcję można powtórzyć. Dodałem przykład do odpowiedzi, ponieważ uważam, że tak naprawdę jest to potrzebne. – mivk

11

myślę to, co chcesz, aby uzyskać listę wartości z jednej opcji. W tym celu możesz powtórzyć tę opcję tyle razy, ile potrzeba, i dodać jej argument do tablicy.

#!/bin/bash 

while getopts "m:" opt; do 
    case $opt in 
     m) multi+=("$OPTARG");; 
     #... 
    esac 
done 
shift $((OPTIND -1)) 

echo "The first value of the array 'multi' is '$multi'" 
echo "The whole list of values is '${multi[@]}'" 

echo "Or:" 

for val in "${multi[@]}"; do 
    echo " - $val" 
done 

Wyjście będzie:

$ /tmp/t 
The first value of the array 'multi' is '' 
The whole list of values is '' 
Or: 

$ /tmp/t -m "one arg with spaces" 
The first value of the array 'multi' is 'one arg with spaces' 
The whole list of values is 'one arg with spaces' 
Or: 
- one arg with spaces 

$ /tmp/t -m one -m "second argument" -m three 
The first value of the array 'multi' is 'one' 
The whole list of values is 'one second argument three' 
Or: 
- one 
- second argument 
- three 
Powiązane problemy