Warum wird in diesem einfachen Bash-Skript nicht echo $1
gedruckt $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 $1
gedruckt $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, echo
die nicht für beliebige Daten verwendet werden können).
$1
Allgemeinen von den Funktionen $1
, obwohl sie die gleichen werden können, wenn sie wie oben vorgeschlagen verwendet werden. Wenn ich Sie richtig echo
echo $1
print_something $2
$1
echo $1
ist nur dann sinnvoll, wenn Sie $1
als durch $ IFS begrenzte Liste der zu erweiternden Dateimuster behandelt werden möchten . echo "$1"
wäre sinnvoller, würde aber nicht den inhalt $1
für werte $1
wie ausgeben -nene
, -EE
...