Warum wird in diesem einfachen Bash-Skript nicht echo $1gedruckt $1?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
Warum wird in diesem einfachen Bash-Skript nicht echo $1gedruckt $1?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
Antworten:
Positionsparameter beziehen sich auf die Argumente des Skripts in der Hauptebene des Skripts, aber auf Funktionsargumente im Funktionskörper. So
print_something Something
würde tatsächlich drucken Something.
Wenn Sie die Argumente des Skripts an eine Funktion übergeben möchten, müssen Sie dies explizit tun. Verwenden
print_something "$1"
das erste Argument übergeben, oder
print_something "$@"
um sie alle zu übergeben, obwohl die Funktion im Beispiel nur die erste verwendet.
"$@"an print_something, wie es derzeit geschrieben wird, würde jedoch immer noch nur das erste der Argumente ausgeben.
"$*"wäre eine einzelne Zeichenfolge (verbunden mit dem ersten Zeichen von $IFS), während "$@"eine Liste von einzeln zitierten Elementen wäre.
"$@", auch wenn in diesem Fall nur ein solcher Parameter vorhanden ist, müssen Sie alle diese Fälle abdecken . Wenn das OP beschließt, einen zweiten Parameter hinzuzufügen, muss der Funktionsaufruf nicht geändert werden. Und jeder andere, der dies liest, lernt, wie man es richtig macht, um zu vermeiden, dass es auch später noch einmal gemacht werden muss.
Dies liegt daran, dass eine aufgerufene Funktion unabhängig von der Menge der Eltern / Aufrufer eine eigene Menge von Positionsparametern erhält. Versuchen
print_something "$1"
(und echo "$1", oder noch besser printf '%s\n' "$1", denken Sie daran, Parametererweiterungen anzugeben, echodie nicht für beliebige Daten verwendet werden können).
$1Allgemeinen von den Funktionen $1, obwohl sie die gleichen werden können, wenn sie wie oben vorgeschlagen verwendet werden. Wenn ich Sie richtig echoecho $1print_something $2$1
echo $1ist nur dann sinnvoll, wenn Sie $1als durch $ IFS begrenzte Liste der zu erweiternden Dateimuster behandelt werden möchten . echo "$1"wäre sinnvoller, würde aber nicht den inhalt $1für werte $1wie ausgeben -nene, -EE...