Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
==
, !=
, <
, >
et =
, Condition | Signification |
---|---|
$chaine1 = $chaine2 | correspond à |
$chaîne1 == $chaîne2 | synonyme de = |
$chaine1 != $chaine2 | ne correspond pas |
$chaine1 < $chaîne2 | vrai si chaine1 est placée lexicographiquement avant chaine2 |
$chaine1 > $chaîne2 | vrai si chaine2 est placée lexicographiquement après chaine2 |
Le shell bash utilise les commandes internes et composées[[ ]]
ou[ ]
(souvent utilisées avecif
) pour les comparaisons de chaînes de caractères.
C'est pourquoi on trouve souvent les options -z
et -n
du tableau ci-dessous, ajoutées au tableau ci-dessus :
Condition | Signification |
---|---|
-z $chaine | ne contient rien |
-n $chaine | contient quelque-chose |
[[ $a == "z*" ]] # vrai si $a est égal à z* [[ $a == z* ]] # vrai si $a commence avec un "z" (reconnaissance de modèles) [[ "$a" < "$b" ]] # vrai si $a se trouve avant $b dans le dictionnaire
-posix :
[ "$a" = "z*" ] # vrai si $a est égal à z* [ "$a" \< "$b" ] # vrai si $a se trouve avant $b dans le dictionnaire
test1= #puis [ -n "$test1" ] #puis echo $?
Donc la chaîne de la variable test1 est égale à zéro.
test2=abc #puis test3=ab #puis [ "$test2" = "$test3" ] #puis echo $?
Donc les deux chaînes de valeur contenue dans les variables test2 et test3 ne sont pas égales.
Tests avec les crochets :
#!/bin/bash var1="def" var2="def" if [ $var1 == $var2 ] ; then echo "1)test de correspondance chaîne de caractères sur valeur de variable: \$var1:"$var1" correspond(==) à \$var2:"$var2"." fi var3="hip" var4="hip" if test $var3 = $var4 ; then echo "2) test de correspondance chaîne de caractères sur valeur de variable: \$var3:"$var3" correspond(=) à \$var4:"$var4"." fi
./mon-script
1) test de correspondance chaîne de caractères sur valeur de variable: $var1:def correspond(==) à $var2:def. 2) test de correspondance chaîne de caractères sur valeur de variable: $var3:hip correspond(=) à $var4:hip.
Tests avec la commande test :
test4=tout-compris #puis test5=toutcompris #puis test $test4 = $test5 #puis echo $?
Donc les chaînes des deux valeurs sont différentes.
#!/bin/bash a="sloiuy" b="aktgjaùkjayaj" if [[ $a < $b ]] ; then echo "OK l'opérateur < fonctionne avec les chaînes de caractère" fi echo " " if [[ $a > $b ]] ; then echo "Les opérateurs < et > signifient avant et après selon l'ordre alphabétique (doubles crochets) " fi echo " " if [ $a \> $b ] ; then echo "Les opérateurs \< et \> signifient avant et après selon l'ordre alphabétique (simples crochets) " fi
./mon_script
OK L'opérateur < fonctionne avec les chaînes de caractère Les opérateurs < et > signifient avant et après selon l'ordre alphabétique (doubles crochets) Les opérateurs \< et \> signifient avant et après selon l'ordre alphabétique (simples crochets)
Le shell bash permet d'effectuer aussi des tests sur les fichiers avec la commande interne composée [[ ]]
et la commande interne [ ]
(associées à if ou non).).
if [[ option $FICHIER ]]
Extrait du manpage de bash section CONDITIONS | |
Opérateurs | Retours : |
---|---|
-a fichier | Vrai si le fichier existe. |
-b fichier | Vrai si le fichier existe et est un fichier spécial bloc. |
-c fichier | Vrai si le fichier existe et est un fichier spécial caractère. |
-d fichier | Vrai si le fichier existe et est un répertoire. |
-e fichier | Vrai si le fichier existe. |
-f fichier | Vrai si le fichier existe et est un fichier normal. |
-g fichier | Vrai si le fichier existe et a son bit Set-GID positionné. |
-h fichier | Vrai si le fichier existe et est un lien symbolique. |
-k fichier | Vrai si le fichier existe et a son bit « sticky » positionné. |
-p fichier | Vrai si le fichier existe et est un tube nommé (FIFO). |
-r fichier | Vrai si le fichier existe et est accessible en lecture. |
-s fichier | Vrai si le fichier existe et a une taille strictement positive. |
-t df | Vrai si le descripteur de fichier df est ouvert et se rapporte à un terminal. |
-u fichier | Vrai si le fichier existe et a son bit Set-UID positionné. |
-w fichier | Vrai si le fichier existe et est accessible en écriture. |
-x fichier | Vrai si le fichier existe et est exécutable. |
-G fichier | Vrai si le fichier existe et appartient au GID effectif du groupe. |
-L fichier | Vrai si le fichier existe et est un lien symbolique. |
-N fichier | Vrai si le fichier existe et a été modifié depuis sa dernière lecture. |
-O fichier | Vrai si le fichier existe et appartient à l'UID effectif de l'utilisateur. |
-S fichier | Vrai si le fichier existe et est une socket. |
fichier_1 -ef fichier_2 | Vrai si le fichier_1 et le fichier_2 se rapportent au même périphérique et ont les mêmes numéros d'inœuds. |
fichier_1 -nt fichier_2 | Vrai si le fichier_1 est plus récent que le fichier_2 (selon les dates de dernière modification) ou si fichier_1 existe et non fichier_2. |
fichier_1 -ot fichier_2 | Vrai si le fichier_1 est plus ancien que le fichier_2 ou si fichier_2 existe et non fichier_1. |
Remarque : L'opérateur -e test si le fichier existe quelque soit son statut (fichier, répertoire, lien, etc).
Soit le script mon_script.
#!/bin/bash var1="~/toto" if [ -f "$var1" ] then echo "le fichier existe !" else echo "fichier non trouvé ! Car il n'y a pas de développement du ~ entre guillemets (simples ou doubles)." fi var1=~/toto # Sans guillemets, le ~ est développé. if [ -f "$var1" ] then echo "le fichier existe ! (Sans guillemets, le développement du ~ c'est réalisé)." else echo "fichier inexistant !" fi var1="home/hypathie/toto" if [ -f "$var1" ] then echo "le fichier existe !" else echo "fichier inexistant !" fi if test -f "$var1" then echo "le fichier existe !" else echo "fichier inexistant !" fi
touch ~/toto bash mon_script rm -v ~/toto
fichier non trouvé ! Car il n'y a pas de développement du ~ entre guillemets (simples ou doubles). le fichier existe ! (Sans guillemets, le développement du ~ c'est réalisé). le fichier existe ! le fichier existe ! '/home/hypathie/toto' supprimé
Tests dans un terminal des commande test et [.
touch ~/toto test -f /home/hypathie/toto echo $? [ -f ~/toto ] echo $? rm -v ~/toto
0 0 '/home/hypathie/toto' supprimé
Et voilà !