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" ] }
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.
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 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.
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.
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
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é.)
# 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.