web-dev-qa-db-fra.com

Comment définir la sortie d'une fonction en tant que valeur de variable dans un script bash?

J'ai la fonction suivante pour compter le nombre de fichiers dans un répertoire, dans mon script bash.

file_count() {
  no_of_files=$(find "$1" -maxdepth 1 -type f -printf '.' | wc -c)
}

Je voudrais l'utiliser à plusieurs reprises sur différents répertoires et enregistrer le nombre dans une variable pour chaque répertoire. Actuellement, pour ce faire, j'utilise

file_count $somedir
files_in_somedir="$no_of_files"

Je suis conscient que je mets la variable no_of_files en dehors de la fonction à chaque fois et je souhaite la rendre locale à la fonction, et non pas définir une variable intermédiaire dans le script principal. Ceci est juste au cas où il y aurait une erreur signifiant que la variable ne change pas entre les appels de la fonction (le nom de la fonction est peut-être mal orthographié) et que l'ancienne valeur de no_of _files est utilisée.

Si ma fonction était:

file_count() {
  local no_of_files=$(find "$1" -maxdepth 1 -type f -printf '.' | wc -c)
}

Comment pourrais-je définir facilement ces variables de nombre de répertoires?

5
Arronical

Les fonctions Bash ne ressemblent pas aux fonctions des autres langages de programmation, elles ressemblent davantage à des commandes. Cela signifie qu'ils n'ont pas de valeur de retour classique, mais

  • un code de sortie/retour. Il s'agit d'un nombre entier compris entre 0 et 255, où 0 signifie "succès" et toutes les autres valeurs représentent une erreur. Si vous essayez de spécifier un nombre en dehors de cette plage, il sera pris modulo 256 (ajoutez ou soustrayez 255 de votre nombre jusqu'à ce qu'il corresponde à la plage 0-255).

    Ce code est automatiquement défini sur le code de retour de la dernière instruction exécutée dans la fonction, à moins que vous ne le définissiez manuellement à l'aide de la commande returnname__, comme ceci:

    return 1
    
  • flux de sortie. Chaque fonction Bash peut écrire des chaînes arbitraires dans les flux de sortie (STDOUT et STDERR), exactement comme les scripts normaux. La sortie peut provenir directement des commandes que vous exécutez dans la fonction ou être définie manuellement à l'aide de echoname__.

    Mais au lieu de laisser cette sortie affichée dans la console, vous pouvez la capturer lorsque vous exécutez la fonction, par exemple. en utilisant la syntaxe de substitution de commande de Bash, et enregistrez-la dans une variable de votre script principal:

    example_function() {
        # do something useful
        echo "return this message"
    }
    
    returned_value="$(example_function)"
    

Donc, votre code devrait ressembler à ceci:

file_count() {
    find "$1" -maxdepth 1 -type f -printf '.' | wc -c
    # the line above already prints the desired value, so we don't need an echo
}

files_in_somedir="$(file_count "$somedir")"

Voir valeur de retour dans le script bash (sur dépassement de capacité) pour plus d'informations.

7
Byte Commander