2013-04-24 17 views
6

Ich versuche, Befehlszeilenargumente mit getopts in bash zu verarbeiten. Eine der Anforderungen besteht in der Verarbeitung einer beliebigen Anzahl von Optionsargumenten (ohne die Verwendung von Anführungszeichen).Mehrere Option Argumente mit getopts (bash)

1. Beispiel (nur schnappt sich das erste Argument)

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

2. Beispiel (ich will es so verhalten, aber ohne das Argument“

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

Gibt es eine Möglichkeit zu zitieren ? Dazu

Hier ist der Code ich habe jetzt:

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

Dies kann helfen: http://stackoverflow.com/a/7530327/1983854 – fedorqui

+0

Weitere Angaben erforderlich sind. Welches Verhalten willst du, wenn du 'getoptz.sh -s a -b c' gibst? Ist das '-b' ein Argument für '-s', oder zeigt das' -' eine neue Option an? –

+0

Verwandt mit, aber keinesfalls ein Duplikat von, [Aufruf verschiedener Programme mit verschiedenen Optionen und verschiedenen Argumenten für jede Option] (http://stackoverflow.com/questions/15442950/). Im Allgemeinen empfiehlt es sich, die Richtlinien für die Standardbefehlsschnittstelle zu verwenden [POSIX-Dienstprogrammkonventionen] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html) –

Antwort

3

Sie können die Befehlszeilenargumente selbst analysieren, aber der Befehl getopts kann nicht so konfiguriert werden, dass mehrere Argumente für eine einzelne Option erkannt werden. fedorqui's recommendation ist eine gute Alternative.

Hier ist eine Möglichkeit, die Option, sich zu parsen:

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

"Mehrere Argumente für eine einzige Option erkennen" ist nicht möglich, aber die Option kann wiederholt werden. Ich habe den Antworten ein Beispiel hinzugefügt, weil ich denke, dass das wirklich gewünscht ist. – mivk

11

Ich denke, was Sie wollen, ist eine Liste von Werten aus einer einzigen Option zu erhalten. Dazu können Sie die Option so oft wie nötig wiederholen und ihr Argument zu einem Array hinzufügen.

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

Der Ausgang wäre:

$ /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 
Verwandte Themen