La connaissance des langages de programmation de haut niveau (C/C++, Java, PHP, Python, Perl, etc.) laisse penser au profane que les fonctions du Bourne Again Shell (Bash) devraient fonctionner comme dans ces autres langages.
Au lieu de cela, Les fonctions Bash fonctionnent comme des commandes de l'interpréteur de commandes et s'attendent à ce que des arguments leur soient passés de la même manière que l'on passe une option à une commande de l'interpréteur de commandes (par ex. ls -l
). En effet, arguments de fonction dans Bash sont traités comme paramètres de position ( $1, $2..$9, ${10}, ${11}
et ainsi de suite). Ce n'est pas une surprise si l'on considère que getopts
travaux. N'utilisez pas de parenthèses pour appeler une fonction en Bash.
( Note : Je suis en train de travailler sur OpenSolaris pour le moment).
# Bash style declaration for all you PHP/JavaScript junkies. :-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
function backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nTarball created!\n"
}
# sh style declaration for the purist in you. ;-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
backupWebRoot ()
{
tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
echo -e "\nTarball created!\n"
}
# In the actual shell script
# $0 $1 $2
backupWebRoot ~/public/www/ webSite.tar.zip
Utiliser des noms pour les variables ? Il suffit de faire quelque chose comme ça.
local filename=$1 # The keyword declare can be used, but local is semantically more specific.
Faites attention, cependant. Si l'argument d'une fonction contient un espace, vous pouvez faire ceci à la place ! Autrement, $1
pourrait ne pas être ce que vous pensez.
local filename="$1" # Just to be on the safe side. Although, if $1 was an integer, then what? Is that even possible? Humm.
Vous voulez passer un tableau à une fonction ?
callingSomeFunction "${someArray[@]}" # Expands to all array elements.
À l'intérieur de la fonction, traitez les arguments comme ceci.
function callingSomeFunction ()
{
for value in "$@" # You want to use "$@" here, not "$*" !!!!!
do
:
done
}
Vous avez besoin de transmettre une valeur et un tableau, mais vous devez toujours utiliser "$@" dans la fonction ?
function linearSearch ()
{
local myVar="$1"
shift 1 # Removes $1 from the parameter list
for value in "$@" # Represents the remaining parameters.
do
if [[ $value == $myVar ]]
then
echo -e "Found it!\t... after a while."
return 0
fi
done
return 1
}
linearSearch $someStringValue "${someArray[@]}"
12 votes
"...mais ce qui revient toujours, c'est comment passer un paramètre depuis la ligne de commande" - Oui ! C'est parce que les scripts Bash sont fondamentalement des séquences de lignes de commande - invoquez une fonction dans un script Bash exactement comme si c'était une commande sur la ligne de commande ! :-) Votre appel serait myBackupFunction ".." "..." "xx" ; pas de parenthèses, pas de virgules.
4 votes
La contrepartie de cette question : valeur de retour d'une fonction bash
0 votes
Voir aussi Passer des tableaux en paramètres dans bash