Bashprogrammierung - Parameter



  • shift # Jetzt ist der 10. Parameter an $9
    echo "10. Parameter: $9"
    


  • Das geht so nicht.

    Du kannst nur 10 Parameter übergeben, wobei $0 reserviert ist, also geht nur noch $1 - $9.

    Wenn du mehr willst, dann so wie SeppJ bereits gesagt hat, oder mit $*.



  • Cybertec schrieb:

    Das geht so nicht.

    Du kannst nur 10 Parameter übergeben, wobei $0 reserviert ist, also geht nur noch $1 - $9.

    Wenn du mehr willst, dann so wie SeppJ bereits gesagt hat, oder mit $*.

    Doch, es geht mit shift. Aber was ist eigentlich der unterschied zwischen $@ und $*? Gibt es da einen?



  • An shift habe ich ehrlich gesagt nicht gedacht.

    Ja es gibt einen Unterschied. Beide expandieren die Positionsparameter, aber bei @wirdalleswasin""stehtzueinzelnenParameternexpandiert.Alsoist"@ wird alles was in "" steht zu einzelnen Parametern expandiert. Also ist "@" das gleiche wie "$1" "$2" usw., z.B. wird dann "who time" zu "who" und "time".



  • Cybertec schrieb:

    Ja es gibt einen Unterschied. Beide expandieren die Positionsparameter, aber bei @wirdalleswasin""stehtzueinzelnenParameternexpandiert.Alsoist"@ wird alles was in "" steht zu einzelnen Parametern expandiert. Also ist "@" das gleiche wie "$1" "$2" usw., z.B. wird dann "who time" zu "who" und "time".

    Ja, @ und * sind dunkle bash-Magie, denn @ ist inkonsistent zu allem, was normalerweise in der Expansion-Phase passieren kann. Normalerweise kann nämlich "..." nur zu genau einem Wort expandiert werden, egal was "..." ist. Die einzige Ausnahme ist $@ (und Arrays, die man mit @ anspricht), also was ziemlich inkonsistentes.

    Wichtig ist eigentlich nur, dass man @immerquotet,also"@ immer quotet, also "@" schreibt. Es gibt meines Wissens nach keinen einzigen Fall, wo ein ungequotetes $@ sinnvoll wäre, das würde nämlich globbing ausführen und Wörter falsch trennen und generell ganz großen Unsinn machen.

    Und "$*" ist eigentlich immer falsch, außer man sucht einen einfachen Weg, alle Parameter zu einem einzigen String zusammenzukleben, um sie danach nie wieder zu trennen.

    Das bash reference manual hat aber für das ursprüngliche Problem auch eine Lösung ohne shift parat: Statt $10 kann man einfach ${10} schreiben.



  • Wieso sollte $* falsch sein?

    Wenn man mehr als 10 Parameter übergeben will, bleibt einem gar nichts anderes übrig. Gut, man könnte das noch mit $@ machen, ist aber genauso ein Mist.

    Mal davon abgesehen, wenn man mehr als 10 Parameter übergeben will, sollte man sein Programm noch mal überdenken.


  • Mod

    Cybertec schrieb:

    Wieso sollte $* falsch sein?

    Nein, "$*" mit den Anführungszeichen ist fast immer falsch, außer im erläuterten Fall.



  • Naja, $* mit "" hat Christoph geschrieben. 😃 😉



  • Cybertec schrieb:

    Wieso sollte $* falsch sein?

    Wenn man mehr als 10 Parameter übergeben will, bleibt einem gar nichts anderes übrig. Gut, man könnte das noch mit $@ machen, ist aber genauso ein Mist.

    Nein, $@ und sindsogutwienieaustauschbar.Undbeidesindsogutwieniebrauchbar.Brauchbarsind"* sind so gut wie nie austauschbar. Und beide sind so gut wie nie brauchbar. Brauchbar sind "@" und "".Davonistabernur"*". Davon ist aber nur "@" sinnvoll, weil es die Parameter korrekt in Wörter trennt. "$*" ist nur sinnvoll, wenn man alle Parameter zusammenkleben und nie wieder trennen möchte.

    $* und $@ ungequotet sind praktisch niemals sinnvoll.

    Mehr als 9 Parameter sind gar kein Problem: Nach $9 kommt dann einfach ${10}, ${11} und so weiter.

    edit: Also um es nochmal zu wiederholen, eine gute Faustregel bei Bash ist: Wenn man * schreiben möchte, meint man eigentlich "@".



  • Naja, ich meine das eigentlich nicht.

    Ich habe mir z.B. ein Skript gemacht, um nicht nicht jedes mal chmod +x usw. eingeben zu müssen, und da benutze ich $* z.B..



  • Cybertec schrieb:

    Ich habe mir z.B. ein Skript gemacht, um nicht nicht jedes mal chmod +x usw. eingeben zu müssen, und da benutze ich $* z.B..

    Ja, aber genau in so einem Fall ist "$@" garantiert besser, denn im Gegensatz zu $* funktioniert es. 🙂

    Bei $* kannst du davon ausgehen, dass dein Skript nicht korrekt funktioniert, wenn du Parameter übergibst, die whitespace enthalten.


Anmelden zum Antworten