La connaissance des langages de programmation de haut niveau (C/C++, Java, PHP, Python, Perl, etc.) suggérerait à un profane que les fonctions Shell Bourne Again (Bash) fonctionnent comme celles des autres langages.
Cependant, les fonctions Bash fonctionnent comme des commandes shell et attendent que les arguments leur soient passés de la même manière qu'on pourrait passer une option à une commande shell (par exemple, ls -l
). En effet, les arguments de fonction en Bash sont traités comme des paramètres positionnels ($1, $2..$9, ${10}, ${11}
, et ainsi de suite). Ce n'est pas surprenant étant donné le fonctionnement de getopts
. Ne pas utiliser de parenthèses pour appeler une fonction en Bash.
(Remarque : Je suis en train de travailler sur OpenSolaris en ce moment.)
# Déclaration de style Bash pour tous les fans de PHP/JavaScript. :-)
# $1 est le répertoire à archiver
# $2 est le nom de l'archive tar et zippée une fois tout est terminé.
function backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nArchive créée !\n"
}
# Déclaration de style sh pour les puristes en vous. ;-)
# $1 est le répertoire à archiver
# $2 est le nom de l'archive tar et zippée une fois tout est terminé.
backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nArchive créée !\n"
}
# Dans le script shell réel
# $0 $1 $2
backupWebRoot ~/public/www/ webSite.tar.zip
Vous voulez utiliser des noms pour les variables ? Il suffit de faire quelque chose de similaire à ceci.
local filename=$1 # Le mot-clé declare peut être utilisé, mais local est sémantiquement plus spécifique.
Soyez prudent, cependant. Si un argument d'une fonction contient un espace, vous voudrez peut-être faire cela à la place ! Sinon, $1
pourrait ne pas être ce que vous pensez.
local filename="$1" # Juste pour être du bon côté. Bien que, si $1 était un entier, alors quoi ? Est-ce même possible? Humm.
Vous voulez passer un tableau à une fonction par valeur ?
callingSomeFunction "${someArray[@]}" # Développe tous les éléments du tableau.
A l'intérieur de la fonction, manipulez les arguments de cette manière.
function callingSomeFunction ()
{
for value in "$@"; do # Vous voulez utiliser "$@" ici, pas "$*" !!!!!
:
done
}
Vous devez passer une valeur et un tableau, mais utiliser quand même "$@" à l'intérieur de la fonction ?
function linearSearch ()
{
local myVar="$1"
shift 1 # Supprime $1 de la liste des paramètres
for value in "$@"; do # Représente les paramètres restants.
if [[ $value == $myVar ]]; then
echo -e "Trouvé !\t... après un certain temps."
return 0
fi
done
return 1
}
linearSearch $someStringValue "${someArray[@]}"
À partir de Bash 4.3 et au-dessus, vous pouvez passer un tableau à une fonction par référence en définissant le paramètre d'une fonction avec l'option -n
.
function callingSomeFunction ()
{
local -n someArray=$1 # aussi ${1:?} pour rendre le paramètre obligatoire.
for value in "${someArray[@]}"; do # Super!
:
done
}
callingSomeFunction myArray # Pas de $ devant l'argument. Vous passez par nom, pas par expansion/valeur.
12 votes
"... mais ce qui se passe toujours, c'est comment passer des paramètres depuis la ligne de commande" - Oui! C'est parce que les scripts Bash sont essentiellement des séquences de lignes de commande - invoquez une fonction dans un script Bash exactement comme s'il s'agissait d'une commande sur la ligne de commande! :-) Votre appel serait ma fonctionDeSauvegarde ".." "..." "xx"; aucun parenthèse, pas de virgules.
4 votes
Le pendant de cette question: renvoyer une valeur d'une fonction bash
0 votes
Voir aussi : Passage de tableaux en tant que paramètres en bash