Bash Script mit Parametern?
Hallo,
ich arbeite zur Zeit an einem kleinen Bash Script und frage mich, wie man das folgende Problem löst. Ich rufe mein Script z.B. so auf:
bash script.sh --givenname max --lastname mustermann
man soll es aber auch als
bash script.sh --lastname mustermann --givenname max
aufrufen können. Das Problem ist, dass ich nicht einfach statisch "$1" und "$2" für den Vornamen und "$3" und "$4" für den Nachnamen verwenden kann. Wie kann ich die Parameter einfach nach z.B. "--lastname" durchsuchen, die Position davon erfragen, also z.B. --lastname ist dann "$1", dann weiß ich, der String für den Nachname ist "$2". Ich hoffe mein Problem ist verständlich und danke für alle Antworten im Voraus.
2 Antworten
![](https://images.gutefrage.net/media/user/andie00/1518946613980_nmmslarge__260_60_1080_1080_9461c4b490096d30204b9d24434abaa7.jpg?v=1518946616000)
#!/bin/bash
while : ; do
case "$1" in
--lastname ) Lastname=$2; shift 2 ;;
--givenname ) Givenname=$2; shift 2 ;;
* ) break ;;
esac
done
echo "Hallo $Givenname $Lastname"
Ansonsten kannst du dazu auch getopts (glaube nur für kurze Optionen) oder getopt verwenden.
Ergänzung, besser wäre (siehe Kommentar KarlRanseierIII):
#!/bin/bash
while (( $# )) ; do
case "$1" in
--lastname ) Lastname=$2; shift 2 ;;
--givenname ) Givenname=$2; shift 2 ;;
* ) shift ;;
esac
done
echo "Hallo $Givenname $Lastname"
![](https://images.gutefrage.net/media/user/andie00/1518946613980_nmmslarge__260_60_1080_1080_9461c4b490096d30204b9d24434abaa7.jpg?v=1518946616000)
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Bei *) könnte ich dann shiften, statt zu breaken - die Schleife konsumiert dann stur alle Parameter, während sie die matchenden rauspickt.
Ist eine Frage des gwünschten Verhaltens.
![](https://images.gutefrage.net/media/user/andie00/1518946613980_nmmslarge__260_60_1080_1080_9461c4b490096d30204b9d24434abaa7.jpg?v=1518946616000)
Stimmt, da hast du recht.
Bei
script.sh --falscheOption --givenname max --lastname mustermann
würde mein Beispiel abbrechen und deines die richtige Ausgabe liefern.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Wie gesagt, alles eine Frage der exaten Anforderung, aber unbekanntes zu ignorieren erhöht meistens die Robustheit. (Man kann ja immernoch ne Warnung nach stderr schreiben :-D. )
![](https://images.gutefrage.net/media/user/Lezurex/1575979598014_nmmslarge__0_0_796_796_cce3bba999d2f4ba9ba6f831bd4f56ac.jpg?v=1575979598000)
Schau dir das mal an: https://www.brianchildress.co/named-parameters-in-bash/
Vielleicht besser ein: