#1 Le 24/06/2020, à 09:37
- Plagioclase
[Résolu] Les conditions en Bash...
À celles et ceux qui débutent en Bash, quelque chose de très simple peut vite devenir incompréhensible et vous faire perdre du temps...
$ test "ubuntu" = "ubuntu"; echo $?
0
Ah bon c'est facile les tests entre chaînes de caractères en Bash alors !
Ah oui mais la flemme d'écrire toujours test alors j'utilise une autre syntaxe plus légère...
$ ["ubuntu" = "ubuntu"]; echo $?
[ubuntu : commande introuvable
127
Mais qu'est-ce qui cloche pourquoi la commande est introuvable avec un code d'erreur 127 ?!
Pourtant j'ai bien mis des espaces entre le = pour signifier que c'est un test et pas une affectation !
Quand on est habitués à une syntaxe plus souple comme en Python par exemple on peut vraiment trouver la solution "méchante". Cela prouve d'ailleurs que Bash possède beaucoup d'outils mais trop hétérogènes et avec des erreurs souvent pas assez explicatives. Ici, c'est une bête erreur de syntaxe qui ne se voit pas forcément facilement.
$ [ "ubuntu" = "ubuntu" ]; echo $?
0
Oui, il faut des espaces au niveau des crochets !
Autre convention perturbante : 0 signifie true et 1 false !
On ne se lasse jamais du Bash...
Hors ligne
#2 Le 24/06/2020, à 14:47
- sputnick
Re : [Résolu] Les conditions en Bash...
Salut,
il te manque des espaces après le
[
et avant le fermant effectivement.
Mais en bash, on préfère utiliser la forme
[[ ]]
qui est beaucoup plus facile à utiliser.
Par exemple, nul besoin de mettre des double guillemets avec cette forme.
Pour l'arithmétique, on utilise la forme
(( ))
.
Dernière modification par sputnick (Le 24/06/2020, à 14:49)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#3 Le 24/06/2020, à 15:39
- Watael
Re : [Résolu] Les conditions en Bash...
salut,
la syntaxe n'est pas plus souple en python : il faut un espace entre les commandes.
en python, [ n'est pas une commande, en shell, oui, c'est un alias de test.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 24/06/2020, à 18:01
- sputnick
Re : [Résolu] Les conditions en Bash...
Quoi python Watael ? On parle de bash là.
Pourquoi utiliser
[[ ]]
?
http://mywiki.wooledge.org/BashFAQ/031
http://mywiki.wooledge.org/BashGuide/Te … nditionals
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#5 Le 24/06/2020, à 19:20
- Watael
Re : [Résolu] Les conditions en Bash...
quoi "quoi" ?
Quand on est habitués à une syntaxe plus souple comme en Python par exemple on peut vraiment trouver la solution "méchante".
quant à promouvoir l'utilisation aveugle de [[ quand on en utilise pas les fonctionnalités avancées...
Dernière modification par Watael (Le 24/06/2020, à 19:21)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 27/06/2020, à 09:45
- bruno
Re : [Résolu] Les conditions en Bash...
Autre convention perturbante : 0 signifie true et 1 false !
False
Il n'y a pas de booléens en bash. true et false sont des commandes internes du bash qui renvoient respectivement « succès » et « échec ». Toute commande exécutée avec succès renvoie 0, toute commande qui échoue renvoie un code d'erreur différent de 0.
#7 Le 27/06/2020, à 13:03
- bruno
Re : [Résolu] Les conditions en Bash...
Cela n'aide pas à comprendre, mais AMHA, crée au contraire de la confusion…
Je parlais du code de sortie d'une commande ou exit status qui est une valeur entre 0 et 255.
La sortie d'erreur standard stderr ne « renvoie » pas des valeurs numériques, elle affiche quelque chose d'explicite quand il y a un erreur.
Ce sont deux choses bien différentes.
Exemple avec une commande qui n'existe pas :
$ brash
Ce qui affiche sur la sortie d'erreur standard :
La commande « brash » n'a pas été trouvée, voulez-vous dire :
commande « trash » du deb trash-cli (0.17.1.14-2ubuntu1)
commande « bash » du deb bash (5.0-6ubuntu1)
commande « rbash » du deb bash (5.0-6ubuntu1)
commande « crash » du deb crash (7.2.8-1ubuntu1)
Essayez : sudo apt install <nom du deb>
Le code de retour de la commande précédente est :
$ echo $?
127
Dernière modification par bruno (Le 27/06/2020, à 16:03)
#8 Le 27/06/2020, à 17:03
- sputnick
Re : [Résolu] Les conditions en Bash...
Bruno, bien sur que si la logique boléeene existe en bash !
C'est ce qui permet de faire:
((1==1)) && echo vrai
vrai
[[ ok == ok ]] && echo vrai
vrai
[[ oui == non ]] && echo vrai || echo faux
faux
Si c'est pas de la logique booleene...
Dernière modification par sputnick (Le 27/06/2020, à 17:05)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#9 Le 27/06/2020, à 17:26
- bruno
Re : [Résolu] Les conditions en Bash...
J'ai écrit :
Il n'y a pas de booléens en bash. true et false sont des commandes internes du bash qui renvoient respectivement « succès » et « échec ».
et je persiste. En bash les variables n'ont pas de type, il n'y a pas de variables booléennes, pas plus qu'il n'y a de variable de type entier ou autres. En bash on peut considérer que tout est chaîne de caractères. Évidement que l'on peut utiliser des conditions qui sont vraies ou fausses…
Mais si on essaie d'utiliser des variables booléennes avec des valeurs true/false, cela va forcément foirer :
truc=false
if [ $truc ]
then
echo "$truc is true"
else
echo "$truc is false"
fi
Ou pour s'amuser :
echo $((true))
echo $((false))
Et ceci un un mauvais exemple pour une condition :
((1==1)) && echo vrai
vrai
puisque cela fonctionnera avec n’importe quelle expression arithmétique dont le résultat est différent de 0 :
((7*49)) && echo true
((1+1)) && echo true
Dernière modification par bruno (Le 27/06/2020, à 17:33)
#10 Le 27/06/2020, à 19:11
- Watael
Re : [Résolu] Les conditions en Bash...
hein ? mekeskidi ?
$ declare -i int
$ int=foo
$ echo "$int"
0
je ne suis pas certain que tu comprennes bien ce que tu montres :
$truc est une chaîne, qui existe -> le test est vrai.
une chaîne dans un contexte arithmétique retourne 0
essaie de faire une division par zéro
Dernière modification par Watael (Le 27/06/2020, à 19:12)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 27/06/2020, à 20:00
- bruno
Re : [Résolu] Les conditions en Bash...
Exact on peut donner le type entier, ce que j'ignorais (https://abs.traduc.org/abs-5.1-fr/ch09s04.html).
Mais on ne peux pas avoir de type booléen.
Mes exemples étaient destinés à montrer que true et false ne sont pas des valeurs booléennes et donc sont traité comme de simple chaînes.
#12 Le 27/06/2020, à 20:39
- Watael
Re : [Résolu] Les conditions en Bash...
'comprends pas.
le code de retour d'une commande a bien deux états : vrai ou faux, zéro ou supérieur à zéro.
La plupart des langages de programmation, y compris ceux n'ayant pas explicitement le type booléen, supportent les opérations booléennes et l'algèbre de Boole telles que la conjonction (AND, ET, &, *), la disjonction (OR, OU, |, +), l'équivalence (EQ, EQV, =, ==), ou exclusif/non-équivalence (XOR, NEQV, ^, !=), et la négation (NOT, PAS, ~, !).
on peut faire de l'algèbre booléenne sans valeurs booléennes ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 27/06/2020, à 22:18
- sputnick
Re : [Résolu] Les conditions en Bash...
'comprends pas.
le code de retour d'une commande a bien deux états : vrai ou faux, zéro ou supérieur à zéro.
Walla, toutafé
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#14 Le 28/06/2020, à 08:45
- bruno
Re : [Résolu] Les conditions en Bash...
Pas grave
Encore une fois je dit qu'il n' y a pas de variables booléennes pas que la logique booléenne n'existe pas. Il y a bien des opérateurs booléens et des conditions.
Autrement dit les valeurs true et false utilisées dans beaucoup d'autres langages ne peuvent être assignées à des variables et traitées comme booléens. D'autant plus que true et false sont des commandes internes de bash.
Formellement un code de retour d'une commande n'est pas un booléen puisque qu'il peut prendre des valeurs de 0 à 255. On peut le traiter comme tel en considérant que tout retour différent de 0 est faux.
#15 Le 28/06/2020, à 09:06
- FrancisFDZ
Re : [Résolu] Les conditions en Bash...
Bonjour,
J'affirme depuis longtemps que le binaire "true vs false" na pas de sens, le cas le plus courant, "indéterminé", n'est pas pris en compte. La logique binaire souffre de cette insuffisance, une logique ternaire devrait être clairement définie (fuzzy logic ?)
D'autre part, il n'y a pas lieu d'alimenter le "troll" "En bash, tout est chaine" , équivalent de "sous UNIX, tout est fichier" , affirmations globales qui ne tiennent pas compte du contexte.
Et en réponse à sputnik (citant Watael), le code de retour d'une commande peut être 'vrai" , "faux" ou "ne sait pas répondre" suivant la commande.
=> si ce n'est pas reconnu comme "vrai", ce n'est pas nécessairement "faux"
Dernière modification par FrancisFDZ (Le 28/06/2020, à 09:09)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#16 Le 28/06/2020, à 14:01
- Watael
Re : [Résolu] Les conditions en Bash...
si ce n'est pas 0, c'est une erreur.
je veux bien un exemple de "ne sais pas répondre".
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 28/06/2020, à 14:21
- bruno
Re : [Résolu] Les conditions en Bash...
si ce n'est pas 0, c'est une erreur.
je veux bien un exemple de "ne sais pas répondre".
Ce n'est pas la question.
Une variable booléenne ne peut prendre que deux valeurs true/false, 0/1, oui/non, … (1 bit)
Un code de retour peut prendre 256 valeurs (8 bits) , ce n'est donc pas une variable booléenne.
#18 Le 28/06/2020, à 19:56
- marcus68
Re : [Résolu] Les conditions en Bash...
test expr
[ expr ]
Renvoie la valeur 0 (vrai) ou 1 (faux) en fonction de l'évaluation de l'expression conditionnelle expr.
Que 2 états de sortie pour un test ... donc variable booléenne ...
bruno, essai dans le terminal, ça te fera peut-être des révisions :
man bash
Hors ligne
#19 Le 29/06/2020, à 07:11
- FrancisFDZ
Re : [Résolu] Les conditions en Bash...
si ce n'est pas 0, c'est une erreur.
je veux bien un exemple de "ne sais pas répondre".
Si c'est "0", il n'y a pas ambiguïté : c'est soit vrai, soit faux selon les règles définies au départ. Si ce n'est pas "0" ben ... ce n'est pas "0" et pis c'est tout.
Si on définit "0" comme vrai et "1" comme "faux", la réponse "0" indique la réponse est "vrai", sinon ça peut être n'importe quoi. C'est plus facile à assimiler dans l'autre sens, car on n'imagine normalement qu'une seule et unique façon d'être "vrai" et qu'on assimile "non vrai" à "faux", ce qui n'est pas tout à fait exact. Un exemple ? le syllogisme ;
- tout ce qui est rare est cher
- un cheval pas cher, c'est rare
- ???
Que 2 états de sortie pour un test ... donc variable booléenne ...
Justement, il n'y a pas que 2 états de sortie: c'est soit "vrai" soit "peut-être" et "peut être" peut être n'importe quoi, voire même "vrai sous conditions"
Dernière modification par FrancisFDZ (Le 29/06/2020, à 07:20)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#20 Le 12/07/2020, à 18:28
- LeoMajor
Re : [Résolu] Les conditions en Bash...
là c'est pareil du "hors sujet" dès le post#3
la réponse @spunick#2 a suffit pour @Plagioclase#résolu
----------------
hein ? mekeskidi ?
$ declare -i int
$ int=foo
$ echo "$int"
0
je ne suis pas certain que tu comprennes bien ce que tu montres :
$truc est une chaîne, qui existe -> le test est vrai.
une chaîne dans un contexte arithmétique retourne 0
essaie de faire une division par zéro
rebondir sur declare -i est marginal.
Le type variant (c++) est un peu le père fondateur du langage dynamique. Les autres types, qui viennent compléter untel langage dynamique, ont moins d'impact.
Les avantages du type variant:
flexible,
prend d'importe quelle valeur
(**)peut simuler quasiment n'importe quoi, par abstraction, par conversion, par mimétisme, par modélisation, ou comme autre type de variable
les inconvénients
prend beaucoup plus de mémoire
oblige presque une méthode de filtrage tant que ses variables sont très, trop diverses. d'où pcre, et regex ...
La sémantique est parfois déplacée dans le syntaxique (gestion différente des erreurs entre un langage dynamique et typé (fortement))
---
il n'y a pas de variables booléennes en bash ? oui, type variant majoritaire et type integer, -a -A objets type variant
la variable booléenne peut être cependant simulée par le type variant (**) ; foo="true"
---
logique booléenne ou pas dans les tests conditionnels en bash ? logique ou logique booléenne ou sémantique; pour moi, c'est un peu la même chose.
----
@FrancisFDZ
l'interpréteur cherche d'abord les fichiers, puis les commandes, (cela renvoie à complete et compagnie)
Il pourrait d'ailleurs renvoyé des faux positifs (file not found), lapin( Unknown identifier), mais il s'arrête sur le dernier test des commandes
>pas d'identification des mots sous le curseur, donc "aucun objet" reconnu
Hors ligne
#21 Le 12/07/2020, à 18:49
- FrancisFDZ
Re : [Résolu] Les conditions en Bash...
Je maintiens que "non vrai" ne veut pas nécessairement dire "faux", pas plus que "non faux" ne peut pas systématiquement être considéré comme "vrai" ; dans tous les ces il faut prendre en compte le contexte.La "méthode" de Descartes dit qu'il ne faut pas prendre pour "vrai" quelque chose qui n'a pas été démontré comme tel, il en va de même pour "faux"
Dans les "curiosités" des lignes de commande, il a existé ce dialogue surprenant entre l'utilisateur et son PC
make fire
don't know how to make fire
why
no match
Ce n'est plus possible actuellement.
Dernière modification par FrancisFDZ (Le 12/07/2020, à 18:57)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne