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
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
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
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 ] # 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
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
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
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
- Espace manquant:
[ "$a"="$b" ]est incorrect, la forme correcte est[ "$a" = "$b" ] - Variable sans guillemets:
[ -f $file ]devrait être[ -f "$file" ] - 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
[ "$a" -eq "$b" ] && echo "est vrai" || echo "est faux"