Das Wissen über Hochsprachen (C/C++, Java, PHP, Python, Perl, usw.) würde dem Laien nahelegen, dass Bourne Again Shell (Bash)-Funktionen genauso funktionieren sollten wie in diesen anderen Sprachen.
Stattdessen arbeiten Bash-Funktionen wie Shell-Befehle und erwarten, dass Argumente genauso übergeben werden wie man einer Option bei einem Shell-Befehl übergibt (z. B. ls -l
). In der Tat werden Funktionsargumente in Bash als Positionsparameter behandelt ($1, $2..$9, ${10}, ${11}
und so weiter). Dies ist keine Überraschung, wenn man bedenkt, wie getopts
funktioniert. Verwenden Sie keine Klammern zur Ausführung einer Funktion in Bash.
(Hinweis: Ich arbeite gerade zufällig an OpenSolaris.)
# Bash-Style-Deklaration für alle PHP/JavaScript-Junkies. :-)
# $1 ist das zu archivierende Verzeichnis
# $2 ist der Name der tar- und zip-Datei, wenn alles erledigt ist.
function backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nTarball erstellt!\n"
}
# sh-Style-Deklaration für den Puristen in dir. ;-)
# $1 ist das zu archivierende Verzeichnis
# $2 ist der Name der tar- und zip-Datei, wenn alles erledigt ist.
backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nTarball erstellt!\n"
}
# Im eigentlichen Shell-Skript
# $0 $1 $2
backupWebRoot ~/public/www/ webSite.tar.zip
Möchten Sie Namen für Variablen verwenden? Mach einfach das hier.
lokale Dateiname=$1 # Das Schlüsselwort declare kann verwendet werden, aber local ist semantisch genauer.
Sei jedoch vorsichtig. Wenn ein Argument einer Funktion ein Leerzeichen enthält, möchten Sie vielleicht stattdessen dies tun! Andernfalls ist $1
vielleicht nicht das, was du denkst.
lokale Dateiname="$1" # Nur um auf der sicheren Seite zu sein. Obwohl, wenn $1 eine ganze Zahl war, was dann? Ist das überhaupt möglich? Humm.
Möchten Sie ein Array an eine Funktion nach Wert übergeben?
callingSomeFunction "${someArray[@]}" # Erweitert sich auf alle Array-Elemente.
In der Funktion behandeln Sie die Argumente so.
function callingSomeFunction ()
{
für Wert in "$@" # Sie sollten hier "$@" verwenden, nicht "$*" !!!!!
tu
:
fertig
}
Müssen Sie einen Wert und ein Array übergeben, aber trotzdem "$@" in der Funktion verwenden?
function linearSearch ()
{
lokale myVar="$1"
shift 1 # Entfernt $1 aus der Parameterliste
für Wert in "$@" # Stellt die verbleibenden Parameter dar.
tu
wenn [[ $Wert == $myVar ]]
dann
echo -e "Gefunden!\t... nach einer Weile."
rückkehr 0
fi
fertig
zurückkehren 1
}
linearSearch $someStringValue "${someArray[@]}"
In Bash 4.3 und höher können Sie ein Array an eine Funktion durch Verweis übergeben, indem Sie den Parameter einer Funktion mit der -n
-Option definieren.
function callingSomeFunction ()
{
lokale -n someArray=$1 # auch ${1:?} um den Parameter obligatorisch zu machen.
für Wert in "${someArray[@]}" # Schön!
tu
:
fertig
}
callingSomeFunction myArray # Kein $ vor dem Argument. Sie übergeben per Namen, nicht durch Expansion / Wert.