Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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)


On ne peut pas mettre d'array dans un string!
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


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#5 Le 24/06/2020, à 19:20

Watael

Re : [Résolu] Les conditions en Bash...

quoi "quoi" ?

Plagioclase a écrit :

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... hmm

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...

Plagioclase a écrit :

Autre convention perturbante : 0 signifie true  et 1 false !

False wink
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.

Hors ligne

#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)

Hors ligne

#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)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 27/06/2020, à 17:26

bruno

Re : [Résolu] Les conditions en Bash...

J'ai écrit :

bruno a é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)

Hors ligne

#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.

Hors ligne

#12 Le 27/06/2020, à 20:39

Watael

Re : [Résolu] Les conditions en Bash...

'comprends pas. sad

le code de retour d'une commande a bien deux états : vrai ou faux, zéro ou supérieur à zéro.

wikidpédia :

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...

Watael a écrit :

'comprends pas. sad

le code de retour d'une commande a bien deux états : vrai ou faux, zéro ou supérieur à zéro.


Walla, toutafé


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#14 Le 28/06/2020, à 08:45

bruno

Re : [Résolu] Les conditions en Bash...

Pas grave wink
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.

Hors ligne

#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...

Watael a écrit :

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. wink
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.

Hors ligne

#18 Le 28/06/2020, à 19:56

marcus68

Re : [Résolu] Les conditions en Bash...

manuel de bash a écrit :

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...

Watael a écrit :

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
-  ???

marcus68 a écrit :

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
----------------

watael a écrit :

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