Commande test du Shell

testLa commande est un outil d'évaluation conditionnelle intégré au Shell utilisé pour évaluer des expressions et renvoyer une valeur booléenne (true/false). Elle est généralement utilisée avecifinstructions, et constitue la base de la mise en œuvre du contrôle logique dans les scripts Shell.

La commande test dans Shell est utilisée pour vérifier si une condition est vraie. Elle peut effectuer des tests dans trois domaines : les valeurs numériques, les chaînes de caractères et les fichiers.

Format de syntaxe

test EXPRESSION
# ou 
[ EXPRESSION ]  # 注意方括号内必须有空格

Opérations de test de fichiers

testLa commande est le plus souvent utilisée pour vérifier les attributs de fichiers. Voici les options courantes de test de fichiers :

Operator Description Exemple
-e Le fichier existe [ -e file.txt ]
-f Est un fichier régulier [ -f /path/to/file ]
-d Est un répertoire [ -d /path/to/dir ]
-r Lisible [ -r file.txt ]
-w Inscriptible [ -w file.txt ]
-x Exécutable [ -x script.sh ]
-s Taille du fichier > 0 [ -s logfile ]
-L Est un lien symbolique [ -L symlink ]

Exemple de script:

Exemples

#!/bin/bash

file="/etc/passwd"

if [ -e "$file" ]; then
    echo "$fileexiste"
    if [ -r "$file" ]; then
        echo "et est lisible"
    fi
else
    echo "$filen'existe pas"
fi

Le résultat de sortie est:

/etc/passwd 存在
并且可读

Comparaison de chaînes

testFournit plusieurs méthodes de comparaison de chaînes :

Operator Description Exemple
-z STRING La chaîne est vide [ -z "$var" ]
-n STRING La chaîne n'est pas vide [ -n "$var" ]
STRING1 = STRING2 Les chaînes sont égales [ "$var1" = "$var2" ]
STRING1 != STRING2 Les chaînes ne sont pas égales [ "$var1" != "$var2" ]

Remarque importante: Les variables de chaîne doivent toujours être placées entre guillemets doubles pour éviter que des variables vides ne provoquent des erreurs de syntaxe.

Exemple:

Exemples

#!/bin/bash

read -p "Entrez le nom d'utilisateur : " username

if [ -z "$username" ]; then
    echo "Erreur : le nom d'utilisateur ne peut pas être vide"
    exit 1
elif [ "$username" = "root" ]; then
    echo "Avertissement : l'utilisation du compte root n'est pas recommandée"
else
    echo "Bienvenue,$username"
fi

Après l'exécution, nous saisissons example dans le terminal, et la sortie est similaire à ce qui suit :

输入用户名: example
欢迎, example

Comparaison numérique

Pour la comparaison numérique,testdes opérateurs différents sont utilisés :

Operator Description Exemple
-eq Égal à [ "$a" -eq "$b" ]
-ne Différent de [ "$a" -ne "$b" ]
-gt Supérieur à [ "$a" -gt "$b" ]
-ge Supérieur ou égal à [ "$a" -ge "$b" ]
-lt Inférieur à [ "$a" -lt "$b" ]
-le Inférieur ou égal à [ "$a" -le "$b" ]

Exemple:

Exemples

#!/bin/bash

read -p "Entrez l'âge : " age

if [ "$age" -lt 0 ]; then
    echo "L'âge ne peut pas être négatif"
elif [ "$age" -lt 18 ]; then
    echo "Mineur"
elif [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then
    echo "Adulte"
else
    echo "Personne âgée"
fi

Après exécution, nous saisissons 12 dans le terminal, et la sortie est similaire à ce qui suit :

输入年龄: 12
未成年人

Opérateurs logiques

testPrend en charge les combinaisons logiques :

Operator Description Exemple
! NON logique [ ! -f "$file" ]
-a ET logique [ "$a" -eq 1 -a "$b" -eq 2 ]
-o OU logique [ "$a" -eq 1 -o "$b" -eq 2 ]

Syntaxe moderne recommandée: Utilisez&&et||au lieu de-aet-o, qui est plus conforme à POSIX :

Exemples

[ "$a" -eq 1 ] && [ "$b" -eq 2 ]  # ET
[ "$a" -eq 1 ] || [ "$b" -eq 2 ]  # OU

Utilisation avancée : [[ ]] et (( ))

Bash fournit une syntaxe de test plus puissante :

Doubles crochets [[ ]]

  • Prend en charge la correspondance de motifs :[[ "$var" == *.txt ]]
  • Prend en charge les expressions régulières :[[ "$var" =~ ^[0-9]+$ ]]
  • Gestion des chaînes plus sûre

Comparaison arithmétique (( ))

  • Conçu spécifiquement pour la comparaison numérique :(( a > b ))
  • Prend en charge des expressions arithmétiques plus complexes

Exemple:

Exemples

if [[ "$file" == *.log ]]; puis
    echo "This is a log file"
fi

if (( $count > 10 )); then
    echo "Le nombre dépasse 10"
fi

Exemples d'applications pratiques

1. Vérifier si un service est en cours d'exécution

Exemples

#!/bin/bash

service="nginx"

if systemctl is-active --quiet "$service"; then
    echo "$service"est en cours d'exécution"
else
    echo "$service"n'est pas en cours d'exécution"
    # Vous pouvez ajouter une commande pour démarrer le service ici
fi

2. Vérification du fichier de sauvegarde

Exemples

#!/bin/bash

backup_file="/backups/data_$(date +%Y%m%d).tar.gz"

if [ ! -f "$backup_file" ]; then
    echo "Erreur : le fichier de sauvegarde$backup_filen'existe pas"
    exit 1
elif [ ! -s "$backup_file" ]; then
    echo "Avertissement : le fichier de sauvegarde est vide"
else
    echo "Vérification de la sauvegarde réussie"
fi

Erreurs courantes et conseils de débogage

  1. Espace manquant:[ "$a"="$b" ]est incorrect, la forme correcte est[ "$a" = "$b" ]
  2. Variable sans guillemets:[ -f $file ]devrait être[ -f "$file" ]
  3. Confusion entre comparaison de chaînes et comparaison numérique: Utilisez=pour comparer des chaînes,-eqpour comparer des valeurs numériques

Astuce de débogage : ajoutez au début du scriptset -xpour activer le mode débogage, ou utilisezechopour afficher l'expression de test :

Exemples

echo "Expression de test : [$a -eq $b ]"
[ "$a" -eq "$b" ] && echo "est vrai" || echo "est faux"
Autres extensions