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?
bash
shell-script
function
Pietro Letti
quelle
quelle
Antworten:
Positionsparameter beziehen sich auf die Argumente des Skripts in der Hauptebene des Skripts, aber auf Funktionsargumente im Funktionskörper. So
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
das erste Argument übergeben, oder
um sie alle zu übergeben, obwohl die Funktion im Beispiel nur die erste verwendet.
quelle
"$@"
anprint_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
(und
echo "$1"
, oder noch besserprintf '%s\n' "$1"
, denken Sie daran, Parametererweiterungen anzugeben,echo
die nicht für beliebige Daten verwendet werden können).quelle
$1
Allgemeinen von den Funktionen$1
, obwohl sie die gleichen werden können, wenn sie wie oben vorgeschlagen verwendet werden. Wenn ich Sie richtigecho
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
...