J'ai essayé de déclarer une variable booléenne dans un script shell en utilisant la syntaxe suivante:
variable=$false
variable=$true
Est-ce correct? De plus, si je voulais mettre à jour cette variable, utiliserais-je la même syntaxe? Enfin, la syntaxe suivante pour utiliser des variables booléennes comme expressions est-elle correcte?
if [ $variable ]
if [ !$variable ]
true
etfalse
dans le contexte de la plupart des extraits ci-dessous, ce ne sont que des chaînes simples, pas lebash built-ins
!!! Veuillez lire la réponse de Mike Holt ci-dessous. (Ceci est un exemple où une réponse fortement votée et acceptée est àtrue
. Il s'avère que la réponse originale de Miku appelait vraiment la fonctiontrue
intégrée, mais pas la réponse révisée. Cela a fait que ces commentaires semblaient faux sur le fonctionnement du code de Miku. La réponse de Miku a depuis été modifiée pour afficher explicitement le code original et le code révisé. Espérons que cela mettra définitivement un terme à la confusion.[ true ] && echo yes, true is true
et (upppsss)[ false ] && echo yes, false is also true
. / bin / true et / bin / false donne un code retour $? pour les fonctions et non pour la comparaison.variable=something
il est vrai, si non défini ,variable=
ce serait faux[[ $variable ]] && echo true || echo false
et inversé[[ ! $variable ]] && echo false || echo true
Réponses:
Réponse révisée (12 février 2014)
Réponse originale
Mises en garde: https://stackoverflow.com/a/21210966/89391
De: Utilisation de variables booléennes dans Bash
La raison pour laquelle la réponse d'origine est incluse ici est que les commentaires avant la révision du 12 février 2014 ne concernent que la réponse d'origine et que de nombreux commentaires sont erronés lorsqu'ils sont associés à la réponse révisée. Par exemple, le commentaire de Dennis Williamson à propos de bash builtin
true
le 2 juin 2010 ne s'applique qu'à la réponse d'origine, pas à la version révisée.la source
if
instruction exécute le contenu de la variable qui est le Bash intégrétrue
. Toute commande pourrait être définie comme la valeur de la variable et sa valeur de sortie serait évaluée.&&
et||
:# t1=true; t2=true; f1=false;
#if $t1 || $f1; then echo is_true ; else echo is_false; fi;
(retourne "true", puisque t1 = true) #if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi
(retourne "true", puisque t2 = true) . Encore une fois, cela fonctionne UNIQUEMENT parce que "true" / "false" sont des commandes intégrées à bash (renvoyant true / false). Vous ne pouvez pas utiliser "if $ var ..." à moins que var soit un cmd (c'est-à-dire vrai ou faux)TL; DR
Problèmes avec la réponse ( originale ) de Miku
Je ne recommande pas la réponse acceptée 1 . Sa syntaxe est jolie, mais elle a quelques défauts.
Disons que nous avons la condition suivante.
Dans les cas suivants 2 , cette condition sera évaluée à true et exécutera la commande imbriquée.
En règle générale, vous souhaitez que votre condition soit évaluée à true lorsque votre variable "booléenne",
var
dans cet exemple, est explicitement définie sur true. Tous les autres cas sont dangereusement trompeurs!Le dernier cas (# 5) est particulièrement vilain car il exécutera la commande contenue dans la variable (c'est pourquoi la condition est évaluée à vrai pour les commandes valides 3, 4 ).
Voici un exemple inoffensif:
Citer vos variables est plus sûr, par exemple
if "$var"; then
. Dans les cas ci-dessus, vous devriez recevoir un avertissement indiquant que la commande est introuvable. Mais on peut encore faire mieux (voir mes recommandations en bas).Voir également l'explication de Mike Holt de la réponse originale de Miku.
Problèmes avec la réponse de Hbar
Cette approche a également un comportement inattendu.
Vous vous attendriez à ce que la condition ci-dessus soit évaluée à false, n'exécutant ainsi jamais l'instruction imbriquée. Surprise!
La citation de la valeur (
"false"
), la citation de la variable ("$var"
), ou l'utilisation detest
ou à la[[
place de[
, ne font aucune différence.Ce que je ne recommande:
Voici les moyens que je vous recommande de vérifier vos "booléens". Ils fonctionnent comme prévu.
Ils sont tous à peu près équivalents. Vous devrez taper quelques touches de plus que les approches dans les autres réponses 5 , mais votre code sera plus défensif.
Notes de bas de page
man woman
serait toujours considérée comme une commande valide, même si aucune page de manuel de ce type n'existe.la source
==
avec[
outest
n'est pas portable. Considérant que la portabilité est le seul avantage[
/test
a plus[[
, rester avec=
.Il semble y avoir un malentendu ici à propos de la fonction intégrée de Bash
true
, et plus précisément de la façon dont Bash développe et interprète les expressions entre crochets.Le code dans la réponse de miku n'a absolument rien à voir avec le Bash intégré
true
, ni/bin/true
, ni aucune autre saveur de latrue
commande. Dans ce cas,true
n'est rien de plus qu'une simple chaîne de caractères, et aucun appel à latrue
commande / builtin n'est jamais effectué, ni par l'affectation de variable, ni par l'évaluation de l'expression conditionnelle.Le code suivant est fonctionnellement identique au code dans la réponse du miku:
La seule différence ici est que les quatre caractères comparés sont «y», «e», «a» et «h» au lieu de «t», «r», «u» et «e». C'est ça. Il n'y a aucune tentative d'appeler une commande ou une commande intégrée nommée
yeah
, ni (dans l'exemple de miku) aucune sorte de traitement spécial en cours lorsque Bash analyse le jetontrue
. C'est juste une chaîne, et complètement arbitraire.Mise à jour (2014-02-19): Après avoir suivi le lien dans la réponse de miku, maintenant je vois d'où vient une partie de la confusion. La réponse de Miku utilise des crochets simples, mais l'extrait de code auquel il renvoie n'utilise pas de crochets. C'est juste:
Les deux extraits de code se comporteront de la même manière, mais les crochets changent complètement ce qui se passe sous le capot.
Voici ce que Bash fait dans chaque cas:
Pas de parenthèses:
$the_world_is_flat
dans la chaîne"true"
."true"
tant que commande.true
commande (soit intégrée, soit/bin/true
, selon la version de Bash).true
commande (qui est toujours 0) avec 0. Rappelez-vous que dans la plupart des shells, un code de sortie de 0 indique le succès et tout le reste indique l'échec.if
instructionthen
Supports:
$the_world_is_flat
dans la chaîne"true"
.string1 = string2
. L'=
opérateur est l' opérateur de comparaison de chaînes de bash . Donc..."true"
et"true"
.if
instructionthen
.Le code sans parenthèses fonctionne, car la
true
commande renvoie un code de sortie de 0, ce qui indique la réussite. Le code entre crochets fonctionne, car la valeur de$the_world_is_flat
est identique à la chaîne littéraletrue
sur le côté droit de la=
.Juste pour enfoncer le clou, considérez les deux extraits de code suivants:
Ce code (s'il est exécuté avec les privilèges root) redémarrera votre ordinateur:
Ce code affiche simplement "Nice try." La commande de redémarrage n'est pas appelée.
Mise à jour (2014-04-14) Pour répondre à la question dans les commentaires concernant la différence entre
=
et==
: AFAIK, il n'y a pas de différence. L'==
opérateur est un synonyme spécifique à Bash=
et, pour autant que je sache, ils fonctionnent exactement de la même manière dans tous les contextes.Notez, cependant, que je parle spécifiquement des opérateurs de comparaison de chaînes
=
et==
utilisés dans l'un[ ]
ou dans les[[ ]]
tests. Je ne suggère pas cela=
et==
sont interchangeables partout dans bash.Par exemple, vous ne pouvez évidemment pas faire d'affectation de variable avec
==
, commevar=="foo"
(eh bien techniquement, vous pouvez le faire, mais la valeur devar
sera"=foo"
, parce que Bash ne voit pas d'==
opérateur ici, il voit un=
opérateur (d'affectation), suivi de la valeur littérale="foo"
, qui devient juste"=foo"
).En outre, bien que
=
et==
sont interchangeables, vous devez garder à l' esprit que ces travaux de la façon dont les tests ne dépendent que vous utilisez à l'intérieur[ ]
ou[[ ]]
, et aussi si les opérandes sont cités ou non. Vous pouvez en savoir plus à ce sujet dans Advanced Bash Scripting Guide: 7.3 Autres opérateurs de comparaison (faites défiler jusqu'à la discussion sur=
et==
).la source
$the_world_is_flat && echo "you are in flatland!"
true
ont été faites concernant la réponse originale. (La réponse révisée du 12 février 2014 n'a pas été soumise par miku.) J'ai modifié la réponse pour inclure à la fois l'original et la version révisée. Ensuite, les commentaires des gens ont un sens.true
. Y a-t-il un moyen? Je soupçonne que de nombreux programmeurs habitués à des langues plus strictes qui consultent cette réponse pour les aider à mélanger un peu debash
colle pour leur faciliter la vie auraient besoin d'un===
opérateur pour que les chaînes et les "booléens" ne soient pas réellement interchangeables. Faut - il juste coller à 0 et 1 et de l' utilisation(( $maybeIAmTrue ))
comme suggéré dans Quolonel Question de réponse ?true
, mais généralement pas comme quelque chose pour comparer une variable, car le réeltrue
n'a aucune valeur en soi. Il ne fait que définir l'état de sortie sur0
, indiquant le succès. Il convient de noter qu'elle est essentiellement équivalente à la soi-disant "commande nulle", ou:
. En ce qui concerne l'utilisation de0
et1
, c'est ce que je fais dans tous mes scripts de nos jours où j'ai besoin de booléens. Et j'utilise l'(( ))
opérateur au lieu de[[ ]]
pour évaluer. Donc, par exemple, si je l'aiflag=0
, je peux le faireif (( flag )); then ...
Utilisez des expressions arithmétiques.
Production:
la source
!
, ou cela fera une expansion de l'historique.((! foo))
fonctionne, il en va de même! ((foo))
. J'adore cette solution, BTW. Enfin une manière concise de faire des variables booléennes.((foo || bar))
fonctionne comme prévu.(())
développe les variables récursivement, ce à quoi je ne m'attendais pas.foo=bar; bar=baz; ((foo)) && echo echo
n'imprime rien, mais c'est vrai avecbaz=1
. Ainsi, vous pouvez soutenirfoo=true
etfoo=false
ainsi que 0 ou 1 en faisanttrue=1
.Longue histoire courte:
Il n'y a pas de booléens dans Bash
Bash a des expressions booléennes en termes de comparaison et de conditions. Cela dit, ce que vous pouvez déclarer et comparer dans Bash, ce sont des chaînes et des nombres. C'est ça.
Partout où vous voyez
true
oufalse
dans Bash, c'est soit une chaîne, soit une commande / intégrée qui n'est utilisée que pour son code de sortie.Cette syntaxe ...
est essentiellement ...
La condition est vraie lorsque la commande retourne le code de sortie 0.
true
etfalse
sont builtins Bash et parfois aussi des programmes autonomes qui ne font que retourner le code de sortie correspondant.Le conditionnel ci-dessus équivaut à:
Lorsque vous utilisez des crochets ou la
test
commande, vous comptez sur le code de sortie de cette construction. Gardez à l' esprit que[ ]
et[[ ]]
sont également à quelques commandes / builtins comme les autres. Donc ...Correspond à
et
COMMAND
voici[[ 1 == 1 ]]
La
if..then..fi
construction est juste du sucre syntaxique. Vous pouvez toujours simplement exécuter les commandes séparées par une double esperluette pour le même effet:Lorsque vous utilisez
true
etfalse
dans ces constructions de test, vous ne passez en fait que la chaîne"true"
ou"false"
la commande testing. Voici un exemple:Croyez-le ou non, mais ces conditions donnent toutes le même résultat :
TL; DR; comparer toujours avec des chaînes ou des nombres
Pour que cela soit clair pour les futurs lecteurs, je recommanderais toujours d'utiliser des guillemets autour
true
etfalse
:FAIRE
NE PAS
Peut être
la source
T
etF
préciser que ce ne sont pas de vraies valeurs booléennes.[
(ietest
)[[
et utiliser celle qui convient à son besoin.if ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
Il y a longtemps, alors que tout ce que nous avions était
sh
, les booléens étaient gérés en s'appuyant sur une convention dutest
programme quitest
renvoie un faux état de sortie s'il était exécuté sans aucun argument.Cela permet de penser à une variable qui n'est pas définie comme fausse et à une variable définie comme vraie. Aujourd'hui,
test
est une fonction intégrée à Bash et est généralement connue par son alias à un caractère[
(ou un exécutable à utiliser dans les coquilles qui en manquent, comme le note le dolmen):En raison des conventions de citation, les rédacteurs de scripts préfèrent utiliser la commande composée
[[
qui imitetest
, mais a une syntaxe plus agréable: les variables avec des espaces n'ont pas besoin d'être citées; on peut utiliser&&
et||
comme opérateurs logiques avec une priorité bizarre, et il n'y a pas de limitations POSIX sur le nombre de termes.Par exemple, pour déterminer si FLAG est défini et COUNT est un nombre supérieur à 1:
Ce truc peut être déroutant lorsque des espaces, des chaînes de longueur nulle et des variables nulles sont tous nécessaires et également lorsque votre script doit fonctionner avec plusieurs shells.
la source
[
n'est pas seulement un alias à l'intérieurbash
. Cet alias existe également en tant que fichier binaire (ou en tant que lien pointant vers) et peut être utilisé avec le baresh
. Vérifiezls -l /usr/bin/\[
. Avecbash
/,zsh
vous devriez utiliser à la place[[
un véritable interne pur et beaucoup plus puissant.[
ettest
est également une commande Bash SHELL BUILTIN selon la page de manuel Bash, donc il ne devrait pas y avoir de problème de performance. Même chose avec par exemple Dash. (/ bin / sh peut juste être un lien symbolique vers / bin / dash). Pour utiliser l'exécutable, vous devez utiliser le chemin complet, c'est-à-dire/usr/bin/\[
.Contrairement à de nombreux autres langages de programmation, Bash ne sépare pas ses variables par "type". [1]
La réponse est donc assez claire. Il n'y a pas de variable booléenne dans Bash.
Toutefois:
En utilisant une instruction declare, nous pouvons limiter l'attribution de valeur aux variables. [2]
L'
r
option indeclare
etreadonly
est utilisée pour indiquer explicitement que les variables sont en lecture seule . J'espère que le but est clair.la source
declare -ir false=0 true=1
? Quel est l'avantage d'utiliser un tableau?r
option et lareadonly
commande. Je le ferais comme vous l'avez suggéré dans mes scriptsdeclare and use boolean variables
. Nous pourrions simplement, à plus d'un titre, imiter / supposer qu'une variable a un type . Je n'ai vu cela mentionné nulle part dans votre réponse.Au lieu de simuler un booléen et de laisser un piège aux futurs lecteurs, pourquoi ne pas simplement utiliser une meilleure valeur que vrai et faux?
Par exemple:
la source
0
contraint àfalse
et1
àtrue
. En ce qui concerne les codes de sortie du programme (que bash utilise historiquement), c'est0
pour un résultat positif outrue
et tout le reste est négatif / erreur oufalse
.POSIX (Interface du système d'exploitation portable)
Je manque ici le point clé, qui est la portabilité. C'est pourquoi mon en-tête a POSIX en soi.
Essentiellement, toutes les réponses votées sont correctes, à l'exception qu'elles sont trop spécifiques à Bash .
Fondamentalement, je souhaite seulement ajouter plus d'informations sur la portabilité.
[
et les]
crochets comme dans[ "$var" = true ]
ne sont pas nécessaires, et vous pouvez les omettre et utilisertest
directement la commande:Remarque importante: je ne recommande plus cela, car il est lentement obsolète et plus difficile de combiner plusieurs instructions.
Imaginez ce que ces mots
true
etfalse
signifient pour la coquille, testez-le vous-même:Mais en utilisant des guillemets:
C'est la même chose pour:
Le shell ne peut pas l'interpréter autrement qu'une chaîne. J'espère que vous avez une idée de la qualité de l'utilisation d'un mot clé approprié sans guillemets .
Mais personne ne l'a dit dans les réponses précédentes.
Qu'est-ce que ça veut dire? Eh bien, plusieurs choses.
Vous devez vous habituer à ce que les mots-clés booléens soient réellement traités comme des nombres, c'est-à-dire
true
=0
etfalse
=1
, rappelez-vous que toutes les valeurs non nulles sont traitées commefalse
.Puisqu'ils sont traités comme des nombres, vous devez également les traiter comme ça, c'est-à-dire si vous définissez une variable, dites:
vous pouvez en créer une valeur opposée avec:
Comme vous pouvez le constater par vous-même, le shell imprime une
true
chaîne pour la première fois que vous l'utilisez, mais depuis lors, tout fonctionne via un nombre0
représentanttrue
ou1
représentantfalse
, respectivement.Enfin, ce que vous devez faire avec toutes ces informations
Tout d'abord, une bonne habitude serait d'assigner
0
au lieu detrue
;1
au lieu defalse
.La deuxième bonne habitude serait de tester si la variable est / n'est pas égale à zéro:
la source
Concernant la syntaxe, il s'agit d'une méthodologie simple que j'utilise (par exemple) pour gérer de manière cohérente et saine la logique booléenne:
Si la variable n'est jamais déclarée, la réponse est:
# false
Ainsi, une façon simple de définir une variable à true ( en utilisant cette méthode de syntaxe) serait,
var=1
; à l' inverse,var=''
.Référence:
-n
= Vrai si la longueur de la chaîne var n'est pas nulle.-z
= Vrai si la longueur de la chaîne var est nulle.la source
Dans de nombreux langages de programmation, le type booléen est, ou est implémenté comme, un sous-type d'entier, où
true
se comporte comme1
etfalse
se comporte comme0
:Booléen en C
Booléen en Python
Booléen en Java
Mathématiquement , l'algèbre booléenne ressemble au module arithmétique entier 2. Par conséquent, si un langage ne fournit pas de type booléen natif, la solution la plus naturelle et la plus efficace consiste à utiliser des entiers. Cela fonctionne avec presque toutes les langues. Par exemple, dans Bash, vous pouvez faire:
homme bash :
la source
Bill Parker est rejeté , car ses définitions sont inversées par rapport à la convention de code normale. Normalement, true est défini comme 0 et false est défini comme différent de zéro. 1 fonctionnera pour false, tout comme 9999 et -1. La même chose avec les valeurs de retour de fonction - 0 est un succès et tout ce qui n'est pas nul est un échec. Désolé, je n'ai pas encore la crédibilité de la rue pour voter ou pour lui répondre directement.
Bash recommande d'utiliser des crochets doubles maintenant comme une habitude au lieu de crochets simples, et le lien que Mike Holt a donné explique les différences dans leur fonctionnement. 7.3. Autres opérateurs de comparaison
D'une part,
-eq
est un opérateur numérique, donc avoir le codeémettra une instruction d'erreur, en attendant une expression entière. Cela s'applique à l'un ou l'autre paramètre, car ni l'un ni l'autre n'est une valeur entière. Pourtant, si nous mettons des crochets autour, il n'émettra pas de déclaration d'erreur, mais il donnera une valeur erronée (enfin, dans 50% des permutations possibles). Il évaluera à [[0 -eq true]] = succès, mais aussi à [[0 -eq false]] = succès, ce qui est faux (hmmm .... qu'en est-il que la valeur intégrée soit une valeur numérique?).
Il existe d'autres permutations du conditionnel qui donneront également une sortie erronée. Fondamentalement, tout (autre que la condition d'erreur répertoriée ci-dessus) qui définit une variable à une valeur numérique et la compare à une véritable / fausse prédéfinie, ou définit une variable à une vraie / fausse prédéfinie et la compare à une valeur numérique. En outre, tout ce qui définit une variable sur un true / false builtin et fait une comparaison en utilisant
-eq
. Évitez donc-eq
les comparaisons booléennes et évitez d'utiliser des valeurs numériques pour les comparaisons booléennes. Voici un résumé des permutations qui donneront des résultats invalides:Alors, maintenant ce qui fonctionne. Utilisez des valeurs internes vraies / fausses pour votre comparaison et vos évaluations (comme l'a noté Mike Hunt, ne les mettez pas entre guillemets). Utilisez ensuite un signe égal ou simple ou double (= ou ==) et des parenthèses simples ou doubles ([] ou [[]]). Personnellement, j'aime le signe double égal, car cela me rappelle les comparaisons logiques dans d'autres langages de programmation, et les guillemets doubles simplement parce que j'aime taper. Donc, ces travaux:
Voilà.
la source
true
/false
ne sont pas utilisés ici (ignorez ce que la mise en évidence de la syntaxe de certains éditeurs pourrait impliquer), en particulier dans les[…]
cas où vous pouvez le considérer comme une simple chaîne ici (celle qui est donnée comme paramètre à la[
commande).Mes conclusions et suggestions diffèrent un peu des autres articles. J'ai trouvé que je pouvais utiliser des "booléens" essentiellement comme on le ferait dans n'importe quelle langue "régulière", sans le "saut de cerceau" suggéré ...
Il n'y a pas besoin de
[]
comparaisons de chaînes explicites ... J'ai essayé plusieurs distributions Linux. J'ai testé Bash, Dash et BusyBox . Les résultats étaient toujours les mêmes. Je ne sais pas de quoi parlent les premiers messages votés. Peut-être que les temps ont changé et que c'est tout?Si vous définissez une variable sur
true
, elle est ensuite évaluée comme "affirmative" dans un conditionnel. Définissez-le surfalse
, et il est évalué à "négatif". Très simple! La seule mise en garde est qu'une variable non définie est également évaluée comme vraie ! Ce serait bien s'il faisait le contraire (comme ce serait le cas dans la plupart des langues), mais c'est l'astuce - il vous suffit d'initialiser explicitement vos booléens sur vrai ou faux .Pourquoi ça marche comme ça? Cette réponse est double. A) vrai / faux dans un shell signifie vraiment «pas d'erreur» vs «erreur» (c'est-à-dire 0 vs toute autre chose). B) true / false ne sont pas des valeurs - mais plutôt des instructions dans les scripts shell! En ce qui concerne le deuxième point, l'exécution
true
oufalse
sur une ligne par elle-même définit la valeur de retour pour le bloc dans lequel vous vous trouvez, c'estfalse
-à- dire une déclaration d '"erreur rencontrée", où vrai "efface" cela. L'utiliser avec une affectation à une variable "renvoie" cela dans la variable. Une variable non définie est évaluée commetrue
dans un conditionnel car cela représente également 0 ou "aucune erreur rencontrée".Voir l'exemple de lignes Bash et les résultats ci-dessous. Testez-le vous-même si vous souhaitez confirmer ...
Rendements
la source
Voici un exemple simple qui fonctionne pour moi:
la source
Voici une implémentation d'un shorthanded
if true
.Exemple 1
Exemple 2
la source
J'ai trouvé les réponses existantes déroutantes.
Personnellement, je veux juste avoir quelque chose qui ressemble et fonctionne comme C.
Cet extrait fonctionne plusieurs fois par jour en production:
et pour que tout le monde soit content, j'ai testé:
Ce qui a également bien fonctionné.
Le
$snapshotEvents
évalue le contenu de la valeur de la variable. Vous avez donc besoin de$
.Vous n'avez pas vraiment besoin des parenthèses, je les trouve juste utiles.
Testé sur: GNU Bash, version 4.1.11 (2) -release
Bash Guide for Beginners , Machtelt Garrels, v1.11, 2008
la source
()
n'est pas nécessaire. Ma seule réponse est de l'essayer, cela semble dépendre de la version de Bash, de l'expression ou du contexte réel et autres.Voici une amélioration de la réponse originale de miku qui répond aux préoccupations de Dennis Williamson concernant le cas où la variable n'est pas définie:
Et pour tester si la variable est
false
:À propos d'autres cas avec un contenu désagréable dans la variable, il s'agit d'un problème avec toute entrée externe alimentant un programme.
Toute entrée externe doit être validée avant de lui faire confiance. Mais cette validation ne doit être effectuée qu'une seule fois, lorsque cette entrée est reçue.
Il n'a pas à avoir un impact sur les performances du programme en le faisant à chaque utilisation de la variable comme le suggère Dennis Williamson .
la source
Vous pouvez utiliser shFlags .
Il vous donne la possibilité de définir:
DEFINE_bool
Exemple:
Depuis la ligne de commande, vous pouvez définir:
la source
Il s'agit d'un test de vitesse sur différentes façons de tester les valeurs "booléennes" dans Bash:
Il imprimerait quelque chose comme
la source
Alternative - utilisez une fonction
La définition de la fonction est moins intuitive, mais la vérification de sa valeur de retour est très simple.
la source
Bash brouille vraiment la question avec des gens
[
,[[
,((
,$((
, etc.Tout en marchant sur les espaces de code des autres. Je suppose que c'est surtout historique, où Bash a dû faire semblant d'être de
sh
temps en temps.La plupart du temps, je peux simplement choisir une méthode et m'en tenir à elle. Dans ce cas, j'ai tendance à déclarer (de préférence dans un fichier de bibliothèque commun que je peux inclure avec
.
dans mes scripts réels).Je peux alors utiliser l' opérateur
((
...))
arithmétique pour tester ainsi.Vous devez être discipliné. Votre
testvar
doit être réglé sur$TRUE
ou$FALSE
à tout moment.Dans
((
... les))
comparateurs, vous n'avez pas besoin des précédents$
, ce qui les rend plus lisibles.Je peux utiliser
((
...))
parce$TRUE=1
que$FALSE=0
, c'est-à-dire des valeurs numériques.L'inconvénient est d'avoir à utiliser
$
occasionnellement:ce qui n'est pas si joli.
Ce n'est pas une solution parfaite, mais elle couvre tous les cas dont j'ai besoin d'un tel test.
la source