Différence entre if [ ] et if [[ ]] Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
tony
Membre actif
Membre actif
Messages : 545
Inscription : 10 juil. 2023, 00:54
Status : En ligne

salut,
le cours d'IUT que j'utilise pour apprendre les bases utiles pour écrire un script ne mentionne pas la commande composée if [ ] mais seulement if [[ ]]. Sont-elles identiques par leurs effets ou y a-t-il une différence?
Cours d'IUT:
La commande interne composée [[ est souvent utilisée avec la commande interne composée
if. Elle permet l’évaluation d’expressions conditionnelles portant sur des objets aussi différents
que les permissions sur une entrée, la valeur d’une chaîne de caractères ou encore l’état d’une
option de la commande interne set.
Syntaxe :
[[ expr_cond ]]
j'ai testé les 2 possibilités dans ce script

Code : Tout sélectionner

#!/bin/bash

if [[ $(whoami) = 'root' ]]; then
	echo "You are root"
else
echo "you are not"
fi
la réponse est la même. Par contre

Code : Tout sélectionner

~$ a="au revoir" 
[ $a == 123 ] 
echo $?
bash: [: too many arguments
2
~$  a="au revoir" 
[[ $a == 123 ]] 
echo $?
1

~$  a="au revoir" 
[[ $a == "au revoir" ]] 
echo $?
0
PS: l'IA de DDgo a fait apparaître mon erreur mais aussi un grand mystère sur la façon dont bash interprète une expression. Donc:

Code : Tout sélectionner

~$ a="au revoir" 
[ "$a" == 123 ] 
echo $?
1
conclusion: il est prudent d'utiliser " variable" pour éviter des erreurs d'interprétation, selon l'IA:
The error "too many arguments" occurs because the variable $a is being compared without proper quoting, leading to unexpected behavior. Always quote your variables in conditions, like this: [ "$a" == 123 ]
l'IA me propose une meilleure version de l'affaire:

Code : Tout sélectionner

~$ a="au revoir" 
[ "$a" = 123 ] 
echo "$?"
1
Dont acte.
Et le point final:

Code : Tout sélectionner

[[ is bash's improvement to the [ command. It has several enhancements that make it a better choice if you write scripts that target bash. My favorites are:

    It is a syntactical feature of the shell, so it has some special behavior that [ doesn't have. You no longer have to quote variables like mad because [[ handles empty
     strings  and strings with whitespace more intuitively. 
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 369
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

Tout est dans le man de bash.

Le [...] est un "alias" de la commande test (if [ $a = $b ] est équivalent à if test $a = $b).

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 545
Inscription : 10 juil. 2023, 00:54
Status : En ligne

diesel a écrit : 20 mai 2026, 17:51 Tout est dans le man de bash.
ok, merci, je n'aurais pas eu l'idée de le consulter. Je l'ai téléchargé du coup: lecture pas très simple pour un noob, mais j'ai trouvé les § relatifs à ces opérateurs. Reste à comprendre.
Debian Trixie/ Xfce
Répondre