#1 Le 08/12/2024, à 23:57
- Gelmou
[Résolu] problème avec if test
Bonjour,
j'apprends le shell bash dans le but d'apprendre par la même occasion le système Linux.
Je consulte donc des vidéos de formation sur le sujet.
Je suis sur des explications concernant les tests et en particulier l'outil " if test ".
Un exemple fournit ce petit script pour montrer comment fonctionne cet outil :
1 #!/bin/bash
2
3 nb1=24
4 nb2=28
5 nb3=24
6
7 if test $nb1 -lt $nb2 ; then
8 echo 'nb1 < nb2'
9 fi
Pour la vidéo de démonstration le Terminal en retour affiche :
nb1 < nb2
et dans mon cas cela affiche :
./main15.bash: ligne 7 : test: 28 : nombre entier attendu comme expression
Et là je suis perdu !
I don't understand...
Quelqu'un pour allumer la lumière ?
Merci par avance...
Dernière modification par Gelmou (Le 09/12/2024, à 10:42)
Hors ligne
#2 Le 09/12/2024, à 02:00
- Gelmou
Re : [Résolu] problème avec if test
J'ai trouvé une solution : changer la syntaxe !
Mais alors pourquoi celle de la vidéo ne fonctionne pas sur mon système ?
Solution :
1 #!/bin/bash
2
3 nb1=24
4 nb2=28
5 nb3=24
6
7 if [ "$nb1" -lt "$nb2" ]
8 then
9 echo 'nb1 < nb2'
10 fi
Hors ligne
#3 Le 09/12/2024, à 02:10
- Watael
Re : [Résolu] problème avec if test
salut,
if test n'est pas un "outil"; il s'agit de deux commandes if et test.
à la place de test (ou son alias [ ]), on pourrait aussi bien avoir grep, ou n'importe quel autre commande.
en ce qui concerne, l'erreur produite par ton script, je suspecte une espace mal tapée, qui aurait introduit un espace insécable (nbsp).
réécrit complètement le code. tu l'as fait entre temps.
- les nombres n'ont pas besoin d'être entre guillemets
- pour être sûr que ce sont des nombres, il est possible de typer les variables avec declare -i <nomVar>=<valeur> (-i pour integer : nombre entier)
- test est un meilleur nom de commande que [ ]
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 09/12/2024, à 03:52
- Gelmou
Re : [Résolu] problème avec if test
Merci Watael,
ce n'est pas un script que j'ai écris, je l'ai trouvé tel quel dans une vidéo d'explications.
Il n'y a pas de faute d'espace dans la copie que j'en ai faite. Ça j'en suis sur.
Vérifié, re-vérifié, etc...
Comme je suis en train d'apprendre (et en plus je débute) je crois que je n'ai pratiquement rien compris au langage technique que tu viens de m'exposer.
Je ne vais pas t'embêter à m'expliquer chaque chose que je n'ai pas comprise parce que cela viendra avec les progrès je pense. Et le travail...
Et la correction que j'y ai apporté c'est en cherchant sur des tutos/sites où sont données des explications là aussi, avec d'autres exemples.
Et je me suis efforcé de comprendre ce qui était concerné dans ces exemples simples en les comparant.
Et par tâtonnements j'ai pu modifier le script que j'avais au départ de sorte à ce qu'il fonctionne.
Maintenant j'ai encore pas mal de choses à y comprendre...
En tout cas merci pour ta réponse.
Hors ligne
#5 Le 09/12/2024, à 04:12
- Watael
Re : [Résolu] problème avec if test
quand j'introduis un espace insécable après $nb2, j'obtiens bien le même message d'erreur.
/tmp/test.bash: ligne 6 : test: 28 : nombre entier attendu comme expression
c'est ici-------------------------^
on voit deux espaces, c'est qu'il y a un caractère "invisible".
tu l'as écrit "à la main", ou tu as fait un copier/coller depuis le site (lequel ? ) du tutoriel ?
pour être sûr, refais la manip.
si tu as encore cet espace après $nb2, supprime-le, et réexécute le script.
Dernière modification par Watael (Le 09/12/2024, à 04:19)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 09/12/2024, à 05:38
- sputnick
Re : [Résolu] problème avec if test
Quitte à apprendre, utilise la syntaxe adéquate,
(( <opération arithmétique> ))
Ce qui donne au final:
#!/bin/bash
nb1=24
nb2=28
nb3=24
if ((nb1 < nb2)) ; then
echo 'nb1 < nb2'
fi
Beaucoup plus logique, simple, clair, lisible et maintenable
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#7 Le 09/12/2024, à 05:45
- Watael
Re : [Résolu] problème avec if test
Beaucoup plus logique, simple, clair, lisible et maintenable
peut-être, mais ce n'est pas POSIX.
quitte à apprendre, autant commencer par les bases portables.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 09/12/2024, à 05:46
- sputnick
Re : [Résolu] problème avec if test
Pas d'accord. Gelmou n'utilise pas sh mais bash.
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#9 Le 09/12/2024, à 05:55
- Watael
Re : [Résolu] problème avec if test
mouais. mais en fait, gelmou veut apprendre à utiliser test.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 09/12/2024, à 05:57
- sputnick
Re : [Résolu] problème avec if test
Je l'invite donc à apprendre les tests propres à bash:
(( ))
[[ ]]
qui sont bien plus intuitifs, moins sujets à erreurs et moins piégeux
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#11 Le 09/12/2024, à 06:34
- Watael
Re : [Résolu] problème avec if test
pour des tests simples, je trouve ça surdimensionné.
quand il en sera à évaluer des conditions ternaires(?), ou des regex, ce sera les bons outils dont il devra connaître le prédécesseur(?).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 09/12/2024, à 06:41
- sputnick
Re : [Résolu] problème avec if test
Quand on est débutant, faire du POSIX n'est que très rarement un enjeu.
Pourquoi le serait-ce? A moins de faire du shell pour systèmes embarqués ou des Unix exotiques, mais c'est une spécialisation.
Quand on apprends, il est préférable de ne pas se spécialiser dans des syntaxes tordues et pas intuitives.
C'est sujet à erreur, on le voit bien ici.
De la clarté!
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#13 Le 09/12/2024, à 07:04
- sputnick
Re : [Résolu] problème avec if test
Conseils par les pros du bash, dont je fais partie:
[ ou test est la commande de test POSIX. Elle peut effectuer des tests simples sur les fichiers et les chaînes de caractères. Dans bash, vous devriez utiliser à la place le plus puissant [[ et bannir [ par souci de cohérence. [[ peut faire de la correspondance de motifs, est plus rapide et plus sûr à utiliser.
See
http://mywiki.wooledge.org/BashGuide/Te … nditionals
http://mywiki.wooledge.org/BashFAQ/031
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#14 Le 09/12/2024, à 07:10
- nany
Re : [Résolu] problème avec if test
Bonjour,
De la clarté!
Personnellement, je ne vois pas en quoi les messages d’erreur sont plus clairs en cas de saisie d’espace insécable, surtout quand on débute.
$ cat -n ./test.bash
1 #!/bin/bash
2
3 nb1=24
4 nb2=28
5 nb3=24
6
7 if test $nb1 -lt $nb2 ; then
8 # ^------ici, une espace insécable
9 echo 'nb1 < nb2'
10 fi
11
12 if (( nb1 < nb2 )) ; then
13 # ^------ici, une espace insécable
14 echo 'nb1 < nb2'
15 fi
16
17 if [[ $nb1 -lt $nb2 ]] ; then
18 # ^------ici, une espace insécable
19 echo 'nb1 < nb2'
20 fi
$
$ ./test.bash
./test.bash: ligne 7 : test: 28 : nombre entier attendu comme expression
./test.bash: ligne 12: ((: nb1 < nb2 : erreur de syntaxe : opérateur arithmétique non valable (le symbole erroné est « »)
./test.bash: ligne 17: erreur de syntaxe dans une expression conditionnelle : symbole « ; » inattendu
./test.bash: ligne 17: erreur de syntaxe près de « ; »
./test.bash: ligne 17: `if [[ $nb1 -lt $nb2 ]] ; then'
$
Hors ligne
#15 Le 09/12/2024, à 07:23
- sputnick
Re : [Résolu] problème avec if test
Dans le bashrc pour désactiver les espaces insécables non intentionels:
if [[ $- =~ .*i.* ]]; then
setxkbmap -option "nbsp:none"
fi
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#16 Le 09/12/2024, à 10:41
- Gelmou
Re : [Résolu] problème avec if test
Merci pour toutes ces réponses.
Il va me falloir un peu de temps pour les digérer...
Alors je réponds d'abords à cette question :
tu l'as écrit "à la main", ou tu as fait un copier/coller depuis le site (lequel ? ) du tutoriel ?
Alors pour faire bref : je dirai que j'apprends à connaître le Terminal pour apprendre à me dépatouiller avec le système Linux,
afin de pouvoir faire la maintenance de mon PC équipé pour le moment d'un dualboot W7/Linux Mint (pour faire très vite...).
Donc à usage domestique.
Je suis tombé sur cette chaîne YouTube de vidéos de formation : https://www.youtube.com/@formation-video/videos
Et j'en suis à celle-là : https://www.youtube.com/watch?v=bP7lBGERtfA
Cette question de test se trouve à 10mn 22s de visionnage, soit ici :
Alors oui, j'ai bien copié ce code à la main. D'où certainement l'erreur d'espace...
Car sans m'en rendre compte j'ai dû corriger cette erreur puisque maintenant après avoir ressaisi le code (celui du début de mon post) il fonctionne !
Le Terminal affiche bien :
nb1 < nb2
Du coup mes excuses pour le dérangement comme on dit.
Et je vais en profiter pour étudier vos réponses et arguments. Ça me sera un leçon...
Hors ligne
#17 Le 09/12/2024, à 12:33
- Gelmou
Re : [Résolu] problème avec if test
À noter qu'entre temps, pour éclairer ma lanterne, j'ai aussi trouvé ceci dans la rubrique : Cours et tutoriels
Hors ligne
#18 Le 09/12/2024, à 13:00
- sputnick
Re : [Résolu] problème avec if test
Tu ne comprends pas l'anglais?
Parce que tes ressources semblent un peu légères.
http://mywiki.wooledge.org/BashGuide
https://mywiki.wooledge.org/BashFAQ
sont très bien et éprouvés, au pire tu peux utiliser la traduction du navigateur.
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#19 Le 09/12/2024, à 13:08
- Gelmou
Re : [Résolu] problème avec if test
L'anglais quand on n'est pas spécialement anglophone pour apprendre de l'informatique c'est une contrainte supplémentaire pas négligeable.
Vu mon niveau débutant complet, des choses basiques me permettent de commencer à mettre de l'ordre non ?
Ça doit bien se trouver en français.
Mais je prends quand même les liens en répertoire car je peux très bien y revenir (mon anglais s'améliorant d'autant que les commandes sont toujours en anglais...).
Merci quand même.
Hors ligne
#20 Le 09/12/2024, à 13:14
- sputnick
Re : [Résolu] problème avec if test
Le problème avec tes ressources que t'as choisis en fonction de paramètres de confort, c'est que tu va apprendre une syntaxe vieillotte.
Libre à toi.
Merci quand même.
J'aime bien le 'quand-même'
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#21 Le 09/12/2024, à 13:38
- Gelmou
Re : [Résolu] problème avec if test
La cible du " quand même " ce n'est pas l'effort que tu as consacré à me renseigner.
Ni son objet.
C'est la différence de niveau qui me concerne par rapport à la complexité du sujet, et ce que je peux en faire.
Autodidacte, pas informaticien pour un sou, ce n'est pas tout à fait " libre à soi " quand on ne connaît absolument pas le domaine dans lequel on met les pieds.
Tu me diras il y a une autre solution : c'est de ne pas y entrer !
Mais là je pense qu'il s'agit alors d'une tout autre problématique...
Dernière modification par Gelmou (Le 09/12/2024, à 13:39)
Hors ligne
#22 Le 09/12/2024, à 13:42
- sputnick
Re : [Résolu] problème avec if test
Le shell, ce n'est pas très dur à apprendre.
Je te conseille d'apprendre, un petit peu chaque jour pourquoi pas.
Je suis aussi autodidacte et te fais profiter de mon expérience.
Éviter les ressources non éprouvées. Notamment le site tlp.
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#23 Le 09/12/2024, à 14:09
- Gelmou
Re : [Résolu] problème avec if test
Je te conseille d'apprendre, un petit peu chaque jour pourquoi pas.
Oui, c'est exactement ce que je fais.
Et parce que (j'ai honte à le dire) c'est plus pour le plaisir d'apprendre et de comprendre que par pure nécessité.
Le but étant de ... joindre l'utile à l'agréable...
Et je sais que tu fais profiter de ton expérience. C'est comme ça que je le prends.
Tout les conseils que je reçois, n'étant pas encore en mesure de les évaluer,
ni même seulement peut-être d'être en capacité de pleinement profiter de leur portée,
et pour cause,
je les note, je les répertorie.
L’écureuil...
Pour la suite reste à avoir de la suite dans les idées comme on dit...
Je ne voudrais pas abuser en prenant/occupant de l'espace temps supplémentaire pour philosopher,
mais apprendre et débuter dans un domaine inconnu,
ça demande non seulement d'engranger les connaissances spécifiques à la matière étudiée,
mais aussi de construire la méthode pour orienter cet apprentissage.
Hors ligne
#24 Le 09/12/2024, à 15:04
- sputnick
Re : [Résolu] problème avec if test
L'apprentissage de nouvelles compétences a de nombreuses vertus en plus du savoir.
C'est bon pour le cerveau, les cellules et le moral. Ça permet de rester mentalement 'fit'.
C'est une habitude nécessaire dans notre monde changeant.
Il n'a pas de honte à avoir à poser des questions ou être débutant.
Et à propos, très belle phrase de Lacan dans ta signature
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#25 Le 09/12/2024, à 16:20
- Watael
Re : [Résolu] problème avec if test
Dans le bashrc pour désactiver les espaces insécables non intentionels:
if [[ $- =~ .*i.* ]]; then setxkbmap -option "nbsp:none" fi
setxkbmap ne concerne que les environnements graphiques. Or, dans ~/.bashrc, ça ne va s'appliquer que lorsqu'un terminal sera ouvert.
cette commande serait mieux parmi les programmes à exécuter au démarrage de la session graphique de l'utilisateur.
pour les terminaux en mode texte (TTYs), j'ai trouvé cette commande qui semble faire la même chose :
echo -e "bind '\"\302\240\":\" \"'" >> $HOME/.bashrc
Dernière modification par Watael (Le 09/12/2024, à 20:44)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne