Renvoyer un booléen à partir d’une fonction Bash

Je veux écrire une fonction bash qui vérifie si un fichier a certaines propriétés et renvoie true ou false. Ensuite, je peux l’utiliser dans mes scripts dans le “si”. Mais que dois-je retourner?

function myfun(){ ... return 0; else return 1; fi;} 

alors je l’utilise comme ceci:

 if myfun filename.txt; then ... 

Bien sûr, cela ne fonctionne pas. Comment cela peut-il être accompli?

Utilisez 0 pour true et 1 pour false.

Échantillon:

 #!/bin/bash isdirectory() { if [ -d "$1" ] then # 0 = true return 0 else # 1 = false return 1 fi } if isdirectory $1; then echo "is directory"; else echo "nopes"; fi 

modifier

Du commentaire de @amichair, ceux-ci sont également possibles

 isdirectory() { if [ -d "$1" ] then true else false fi } isdirectory() { [ -d "$1" ] } 

Pourquoi vous devriez vous soucier de ce que je dis malgré une réponse positive de 200 heures

Ce n’est pas que 0 = true et 1 = false . C’est: zéro signifie pas d’échec (succès) et non nul signifie l’échec (de type N) .

Bien que la réponse sélectionnée soit techniquement “vraie”, veuillez ne pas mettre false return 1 dans votre code. Il aura plusieurs effets secondaires malheureux.

  1. Des développeurs expérimentés vous identifieront en tant qu’amateur (pour la raison ci-dessous).
  2. Les développeurs expérimentés ne le font pas (pour toutes les raisons ci-dessous).
  3. Il est sujet aux erreurs.
    • Même les développeurs expérimentés peuvent confondre respectivement 0 et 1 (pour la raison ci-dessus).
  4. Cela nécessite (ou encouragera) des commentaires superflus et ridicules.
  5. C’est en fait moins utile que les statuts de retour implicites.

Apprenez quelques bash

Le manuel de bash dit:

retourne [n]

Faire en sorte qu’une fonction shell cesse de s’exécuter et renvoie la valeur n à son appelant. Si n n’est pas fourni , la valeur de retour est le statut de sortie de la dernière commande exécutée dans la fonction.

Par conséquent, nous n’avons pas à utiliser 0 et 1 pour indiquer True et False. Le fait qu’ils le fassent est essentiellement une connaissance sortingviale utile uniquement pour le débogage du code, les questions d’interview et la confusion des débutants.

Le manuel de bash dit aussi

sinon le statut de retour de la fonction est le statut de sortie de la dernière commande exécutée

Le manuel de bash dit aussi

( $? ) Développe le statut de sortie du pipeline de premier plan le plus récemment exécuté .

Whoa, attends. Pipeline? Passons au manuel de bash une fois de plus.

Un pipeline est une séquence d’ une ou plusieurs commandes séparées par l’un des opérateurs de contrôle ‘|’ ou ‘| &’.

Oui. Ils ont dit 1 commande est un pipeline. Par conséquent, les trois de ces citations disent la même chose.

  • $? vous dit ce qui s’est passé en dernier
  • Il fait des bulles.

Ma réponse

Ainsi, alors que @Kambus a démontré qu’avec une fonction aussi simple, aucun return n’est nécessaire. Je pense que la démonstration de @ Erik était extrêmement simple comparée aux besoins de la plupart des gens qui liront ceci.

Pourquoi return ?

Si une fonction va retourner le dernier état de sortie de sa commande, pourquoi utiliser le return ? Parce que cela provoque une fonction à cesser de s’exécuter.

Arrêter l’exécution sous plusieurs conditions

 01 function i_should(){ 02 uname="$(uname -a)" 03 04 [[ "$uname" =~ Darwin ]] && return 05 06 if [[ "$uname" =~ Ubuntu ]]; then 07 release="$(lsb_release -a)" 08 [[ "$release" =~ LTS ]] 09 return 10 fi 11 12 false 13 } 14 15 function do_it(){ 16 echo "Hello, old friend." 17 } 18 19 if i_should; then 20 do_it 21 fi 

Ce que nous avons ici est …

La ligne 04 est un retour explicite [-ish] parce que le RHS de && n’est exécuté que si le LHS était vrai

La ligne 09 renvoie true ou false correspondant à l’état de la ligne 08

La ligne 13 retourne faux à cause de la ligne 12

(Oui, cela peut être éliminé, mais l’exemple entier est inventé.)

Un autre motif commun

 # Instead of doing this... some_command if [[ $? -eq 1 ]]; then echo "some_command failed" fi # Do this... some_command status=$? if ! $(exit $status); then echo "some_command failed" fi 

Notez comment la définition d’une variable d’ status démystifie la signification de $? . Mais le vrai problème est que “si le statut n’existe pas” ou inversement “si le statut de sortie” peut être lu à voix haute et expliquer leur signification. Cependant, cette dernière peut être un peu trop ambitieuse, car voir le mot exit peut vous faire croire qu’il quitte le script alors qu’en réalité il quitte le sous-shell $(...) .


** Si vous tenez absolument à utiliser return 1 pour false, je vous suggère d’utiliser au moins return 255 place. Cela provoquera votre futur moi-même, ou tout autre développeur qui doit maintenir votre code à la question “Pourquoi est-ce que 255?” Ensuite, ils feront au moins attention et auront une meilleure chance d’éviter une erreur.

 myfun(){ [ -d "$1" ] } if myfun "path"; then echo yes fi # or myfun "path" && echo yes 

Soyez prudent lorsque vous vérifiez le répertoire uniquement avec l’option -d!
Si la variable $ 1 est vide, la vérification sera toujours réussie. Pour être sûr, vérifiez également que la variable n’est pas vide.

 #! /bin/bash is_directory(){ if [[ -d $1 ]] && [[ -n $1 ]] ; then return 0 else return 1 fi } #Test if is_directory $1 ; then echo "Directory exist" else echo "Directory does not exist!" fi 

Cela pourrait fonctionner si vous réécrivez cette function myfun(){ ... return 0; else return 1; fi;} function myfun(){ ... return 0; else return 1; fi;} function myfun(){ ... return 0; else return 1; fi;} car cette function myfun(){ ... return; else false; fi;} function myfun(){ ... return; else false; fi;} function myfun(){ ... return; else false; fi;} . C’est-à-dire que si false est la dernière instruction de la fonction, vous obtenez un résultat faux pour la fonction entière mais la fonction de return interruptions avec un résultat vrai de toute façon. Je crois que c’est vrai pour mon interprète de bash au moins.