Je veux écrire une fonction bash qui vérifie si un fichier a certaines propriétés et renvoie vrai ou faux. 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?
function
mot clé,myfun() {...}
suffitif
c'est le statut de sortie zéromyfun
: si vous quittezmyfun
avec0
,then ...
est exécuté; si c'est autre choseelse ...
est exécuté.function
mot-clé est un bashisme, et provoquera des erreurs de syntaxe dans certains autres shells. Fondamentalement, c'est soit inutile, soit interdit, alors pourquoi l'utiliser? Ce n'est même pas utile comme cible de grep, car il pourrait ne pas être là (grep for à la()
place).Réponses:
Utilisez 0 pour vrai et 1 pour faux.
Échantillon:
Éditer
D'après le commentaire de @ amichair, ceux-ci sont également possibles
la source
[ -d "$1" ]
.Pourquoi vous devriez vous soucier de ce que je dis malgré qu'il y ait une réponse de plus de 250 votes positifs
Ce n'est pas ça
0 = true
et1 = false
. Il est: zéro signifie pas d'échec (succès) et non nul signifie échec (de type N) .Bien que la réponse sélectionnée soit techniquement "vraie", veuillez ne pas mettre
return 1
** dans votre code pour faux . Il aura plusieurs effets secondaires malheureux.Apprenez quelques bash
Le manuel bash dit (soulignement le mien)
Par conséquent, nous ne devons JAMAIS utiliser 0 et 1 pour indiquer Vrai et Faux. Le fait qu'ils le fassent est essentiellement une connaissance insignifiante utile uniquement pour le débogage du code, les questions d'entrevue et la stupéfaction des débutants.
Le manuel bash dit également
Le manuel bash dit également
Attends. Pipeline? Passons au manuel bash une fois de plus.
Oui. Ils ont dit que 1 commandement est un pipeline. Par conséquent, les 3 de ces citations disent la même chose.
$?
vous dit ce qui s'est passé en dernier.Ma réponse
Ainsi, alors que @Kambus a démontré qu'avec une fonction aussi simple, aucune
return
n'est nécessaire du tout. Je pense que c'était irréaliste par rapport aux besoins de la plupart des gens qui liront ceci.Pourquoi
return
?Si une fonction doit retourner l'état de sortie de sa dernière commande, pourquoi l'utiliser
return
? Parce que cela provoque l'arrêt d'une fonction.Arrêter l'exécution dans plusieurs conditions
Ce que nous avons ici est ...
La ligne
04
est un retour explicite [-ish] true car le RHS de&&
n'est exécuté que si le LHS était vraiLa ligne
09
renvoie soit vrai soit faux correspondant à l'état de la ligne08
La ligne
13
renvoie faux à cause de la ligne12
(Oui, cela peut être analysé, mais l'exemple entier est artificiel.)
Un autre modèle courant
Remarquez comment la définition d'une
status
variable démystifie la signification de$?
. (Bien sûr, vous savez ce que cela$?
signifie, mais quelqu'un de moins bien informé que vous devrez le faire un jour sur Google. À moins que votre code ne fasse du trading à haute fréquence, montrez un peu d'amour , définissez la variable.) Mais le véritable avantage est que "si pas d'existence d'état "ou inversement" si l'état de sortie "peut être lu à haute voix et expliquer leur signification. Cependant, ce dernier peut être un peu trop ambitieux car voir le motexit
peut vous faire penser qu'il quitte le script, alors qu'en réalité il quitte le$(...)
sous - shell.** Si vous insistez absolument sur l'utilisation
return 1
de faux, je vous suggère au moins d'utiliser à lareturn 255
place. Cela amènera votre futur moi-même ou tout autre développeur qui doit maintenir votre code à se demander "pourquoi est-ce 255?" Ensuite, ils feront au moins attention et auront plus de chances d'éviter une erreur.la source
if
succès, faites ceci,else
faites cela". Succès à quoi? Pourrait vérifier vrai / faux, pourrait vérifier une chaîne, un entier, un fichier, un répertoire, des autorisations d'écriture, glob, regex, grep ou toute autre commande qui est sujette à des échecs .true
etfalse
. C'est-à-dire que le mot clétrue
évalue littéralement un code d'état 0. De plus, les déclarations if-then par nature fonctionnent sur des booléens, et non sur des codes de réussite. Si une erreur se produit lors d'une opération booléenne, elle ne doit pas retourner true ou false mais simplement interrompre l'exécution. Sinon, vous obtenez des faux positifs (jeu de mots).return 1
devrait être évitée. En supposant que j'ai unevalidate
fonction, je la trouve raisonnablereturn 1
si la validation échoue. Après tout, c'est une raison pour arrêter l'exécution d'un script s'il n'est pas géré correctement (par exemple, lors de l'utilisationset -e
).return 1
valable. Ma préoccupation concerne tous les commentaires disant «0 = vrai 1 = faux est [insérer un mot négatif]». Ces personnes sont susceptibles de lire votre code un jour. Donc pour eux, voirreturn 255
(ou 42 ou même 2) devrait les aider à y penser davantage et à ne pas les confondre avec «vrai».set -e
l'attrapera toujours.la source
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.
la source
$1
("$1"
), vous n'avez pas besoin de rechercher une variable vide. Le[[ -d "$1" ]]
échouerait car ce""
n'est pas un répertoire.J'ai rencontré un point (pas encore explicitement mentionné?) Sur lequel je trébuchais. Ce n'est pas comment renvoyer le booléen, mais plutôt comment l'évaluer correctement!
J'essayais de dire
if [ myfunc ]; then ...
, mais c'est tout simplement faux. Vous ne devez pas utiliser les supports!if myfunc; then ...
est la façon de le faire.Comme chez @Bruno et d'autres réitérés,
true
et cefalse
sont des commandes , pas des valeurs! C'est très important pour comprendre les booléens dans les scripts shell.Dans cet article, j'ai expliqué et fait une démonstration en utilisant des variables booléennes : https://stackoverflow.com/a/55174008/3220983 . Je suggère fortement de vérifier cela, car il est si étroitement lié.
Ici, je vais fournir quelques exemples de retour et d' évaluation de booléens à partir de fonctions:
Ce:
Ne produit aucune sortie d'écho. (ie
false
retourne faux)Produit:
(ie
true
retourne vrai)Et
Produit:
Parce que 0 (c'est-à-dire vrai) a été renvoyé implicitement .
Maintenant, c'est ce qui me foutait ...
Produit:
ET
ÉGALEMENT produit:
L'utilisation des parenthèses ici a produit un faux positif ! (Je déduis que le résultat de la commande "externe" est 0.)
Le principal point à retenir de mon message est: n'utilisez pas de crochets pour évaluer une fonction booléenne (ou variable) comme vous le feriez pour un contrôle d'égalité typique, par exemple
if [ x -eq 1 ]; then...
!la source
Utilisez les commandes
true
oufalse
juste avant votrereturn
, puisreturn
sans paramètres. Lereturn
va automatiquement utiliser la valeur de votre dernière commande.La fourniture d'arguments à
return
est incohérente, spécifique au type et sujette à erreur si vous n'utilisez pas 1 ou 0. Et comme l'ont indiqué les commentaires précédents, utiliser 1 ou 0 ici n'est pas la bonne façon d'approcher cette fonction.Production:
la source
Cela pourrait fonctionner si vous réécrivez ceci
function myfun(){ ... return 0; else return 1; fi;}
comme cecifunction myfun(){ ... return; else false; fi;}
. C'est-à-dire que sifalse
c'est la dernière instruction de la fonction, vous obtenez un faux résultat pour la fonction entière maisreturn
interrompt la fonction avec le vrai résultat de toute façon. Je crois que c'est vrai pour mon interprète bash au moins.la source
J'ai trouvé que la forme la plus courte pour tester la sortie de la fonction est simplement
la source
Pour des raisons de lisibilité du code, je pense que renvoyer vrai / faux devrait:
return
suivi d'un autre mot-clé (true
oufalse
)Ma solution est
return $(true)
oureturn $(false)
comme indiqué:la source
Dans le prolongement de @Bruno Bronosky et @mrteatime, je vous propose d'écrire votre retour booléen "à l'envers". Voici ce que je veux dire:
Cela élimine l'exigence laide de deux lignes pour chaque déclaration de retour.
la source