Bashprogrammierung - Parameter
-
Hi,
ich hoffe ich hab den richtigen Forumbereich erwischt, da es keinen eigenen für bash-Programmeirung gab...
also mein Problem: ich rufe in einem Bash-Skript ein Programm auf und übergebe ihm über die Skripteingabe die paramerter, also:
./meinProgramm $1 $2 $3
das Skript rufe ich dann über:
./meinSkript.sh p1 p2 p3
auf. So weit funktioniert auch alles. Wenn ich jetzt aber über 9 Parameter haben möchte, dann gibt es Probleme, also bei:
./meinProgramm $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
da er die 0 bei 10 als Zahl und nicht als 10 interpretiert... wie löse ich das ganze? Danke schon mal!
Liebe Grüße
Juliane
-
Willst du einfach alle Parameter durchreichen? Dann nimm doch $@.
-
danke, die Abkürzung kannte ich noch nicht
aber wie würde es theoretisch auch mt der 10 gehen? (wenn ich beispielsweise nur das 10. Argument da als Parameter wollte?)
-
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 @" 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 @" 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 @" 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.
-
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 @" und "@" 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.