البرمجة النصية والأتمتة في لينكس: أتقن Bash
تعلّم كيفية إنشاء سكربتات Bash قوية وأتمتة مهامك اليومية في لينكس.
InSkillCoach
البرمجة النصية والأتمتة في لينكس: أتقن Bash
من أكبر مزايا لينكس قدرته على أتمتة المهام المتكررة بفضل البرمجة النصية (Scripting). فصدفة Bash، المتوفرة على معظم توزيعات لينكس، أداة قوية تتيح إنشاء سكربتات لأتمتة أي مهمة تقريبًا. يقدّم لك هذا الدليل أساسيات البرمجة النصية بلغة Bash وأهم تقنيات الأتمتة.
أساسيات البرمجة النصية في Bash
بنية سكربت Bash
يبدأ كل سكربت Bash بما يسمى “shebang” الذي يحدد المفسِّر الواجب استخدامه:
#!/bin/bash
# Ceci est un commentaire
echo "Bonjour, monde!"
# Sortie avec code de retour 0 (succès)
exit 0
لجعل السكربت قابلًا للتنفيذ:
chmod +x mon_script.sh
لتنفيذ السكربت:
./mon_script.sh
المتغيرات والعمليات
تُعد المتغيرات عنصرًا أساسيًا في أي لغة برمجة نصية:
#!/bin/bash
# Déclaration et utilisation de variables
NOM="Linux"
VERSION=5.15
DISTRIBUTION="Ubuntu"
# Afficher des variables
echo "Je travaille avec $DISTRIBUTION, qui utilise le noyau $NOM version $VERSION"
# Variables d'environnement
echo "Mon répertoire personnel est $HOME"
echo "Mon shell actuel est $SHELL"
# Opérations arithmétiques
let RESULTAT=10+5
echo "10 + 5 = $RESULTAT"
# Autre méthode pour les calculs
CARRE=$((5 * 5))
echo "5² = $CARRE"
المدخلات والمخرجات
التفاعل مع المستخدم والتعامل مع المدخلات والمخرجات:
#!/bin/bash
# Demander une entrée à l'utilisateur
echo "Quel est votre nom ?"
read NOM
# Afficher un message avec l'entrée
echo "Bonjour, $NOM !"
# Arguments de ligne de commande
# $0 est le nom du script
# $1, $2, etc. sont les arguments
# $# est le nombre d'arguments
# $@ représente tous les arguments
echo "Nom du script : $0"
echo "Premier argument : $1"
echo "Nombre d'arguments : $#"
echo "Tous les arguments : $@"
# Redirection de sortie vers un fichier
echo "Ceci est enregistré dans un fichier" > output.txt
# Ajouter à un fichier existant
echo "Ceci est ajouté au fichier" >> output.txt
# Lire depuis un fichier
echo "Contenu du fichier :"
cat output.txt
هياكل التحكم
الشروط
تتيح البنى الشرطية تنفيذ الشيفرة بحسب شروط معينة:
#!/bin/bash
# Structure if-else
NOMBRE=15
if [ $NOMBRE -gt 10 ]; then
echo "$NOMBRE est supérieur à 10"
elif [ $NOMBRE -eq 10 ]; then
echo "$NOMBRE est égal à 10"
else
echo "$NOMBRE est inférieur à 10"
fi
# Opérateurs de comparaison pour nombres
# -eq : égal
# -ne : différent
# -gt : supérieur
# -lt : inférieur
# -ge : supérieur ou égal
# -le : inférieur ou égal
# Test sur les fichiers
if [ -f "/etc/passwd" ]; then
echo "Le fichier /etc/passwd existe"
fi
if [ -d "/etc" ]; then
echo "/etc est un répertoire"
fi
# Opérateurs pour fichiers
# -f : fichier régulier
# -d : répertoire
# -e : existe
# -r : lisible
# -w : modifiable
# -x : exécutable
# Opérateurs logiques
if [ $NOMBRE -gt 10 ] && [ $NOMBRE -lt 20 ]; then
echo "$NOMBRE est entre 10 et 20"
fi
if [ "$NOM" = "Linux" ] || [ "$NOM" = "GNU/Linux" ]; then
echo "Vous utilisez Linux"
fi
الحلقات التكرارية
تتيح الحلقات تكرار الإجراءات:
#!/bin/bash
# Boucle for
echo "Comptage avec for :"
for i in {1..5}; do
echo "Numéro $i"
done
# Boucle for avec liste
echo "Liste de distributions Linux :"
for distro in Ubuntu Fedora "Arch Linux" Debian; do
echo "- $distro"
done
# Boucle for classique (style C)
for ((i=0; i<5; i++)); do
echo "Index $i"
done
# Boucle while
echo "Comptage avec while :"
COUNT=1
while [ $COUNT -le 5 ]; do
echo "Compteur : $COUNT"
let COUNT=COUNT+1
done
# Boucle until (jusqu'à ce que la condition soit vraie)
echo "Décompte avec until :"
COUNT=5
until [ $COUNT -le 0 ]; do
echo "Décompte : $COUNT"
let COUNT=COUNT-1
done
Case (switch)
تفيد بنية case في الاختيارات المتعددة:
#!/bin/bash
echo "Quelle distribution Linux utilisez-vous ? (Ubuntu, Fedora, Arch, Debian)"
read DISTRO
case $DISTRO in
"Ubuntu")
echo "Ubuntu est basé sur Debian et utilise APT."
;;
"Fedora")
echo "Fedora est sponsorisé par Red Hat et utilise DNF."
;;
"Arch")
echo "Arch Linux utilise Pacman et suit un modèle rolling release."
;;
"Debian")
echo "Debian est connu pour sa stabilité et utilise APT."
;;
*)
echo "Je ne connais pas cette distribution."
;;
esac
الدوال
تتيح الدوال إعادة استخدام الشيفرة:
#!/bin/bash
# Définition d'une fonction
saluer() {
echo "Bonjour, $1 !"
}
# Fonction avec retour de valeur
calculer_carre() {
local nombre=$1 # Variable locale
echo $((nombre * nombre))
}
# Appel de fonction
saluer "Alice"
saluer "Bob"
# Récupérer la valeur de retour
resultat=$(calculer_carre 5)
echo "Le carré de 5 est $resultat"
# Fonction avec plusieurs paramètres
addition() {
echo $(($1 + $2))
}
somme=$(addition 10 15)
echo "10 + 15 = $somme"
سكربتات أتمتة عملية
سكربت النسخ الاحتياطي التلقائي
#!/bin/bash
# Script de sauvegarde automatique
# Usage: ./backup.sh [répertoire_source]
# Vérifier si un argument a été fourni
if [ $# -eq 0 ]; then
echo "Usage: $0 [répertoire_source]"
exit 1
fi
# Variables
SOURCE_DIR=$1
BACKUP_DIR="$HOME/backups"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
ARCHIVE_NAME="backup_$DATE.tar.gz"
# Créer le répertoire de sauvegarde s'il n'existe pas
mkdir -p $BACKUP_DIR
# Créer l'archive
echo "Création de la sauvegarde de $SOURCE_DIR..."
tar -czf "$BACKUP_DIR/$ARCHIVE_NAME" "$SOURCE_DIR"
# Vérifier si la sauvegarde a réussi
if [ $? -eq 0 ]; then
echo "Sauvegarde réussie: $BACKUP_DIR/$ARCHIVE_NAME"
echo "Taille: $(du -h "$BACKUP_DIR/$ARCHIVE_NAME" | cut -f1)"
else
echo "Erreur lors de la sauvegarde"
exit 1
fi
# Supprimer les anciennes sauvegardes (plus de 30 jours)
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +30 -delete
echo "Les sauvegardes de plus de 30 jours ont été supprimées."
المراقبة الآلية للنظام
#!/bin/bash
# Script de surveillance système
# Vérifie l'utilisation du CPU, de la mémoire et de l'espace disque
# Seuils d'alerte
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90
LOG_FILE="$HOME/system_monitor.log"
# Fonction de journalisation
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
log_message "Début de la vérification du système"
# Vérification de l'utilisation CPU
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | cut -d. -f1)
log_message "Utilisation CPU: $CPU_USAGE%"
if [ $CPU_USAGE -gt $CPU_THRESHOLD ]; then
MESSAGE="ALERTE: Utilisation CPU à $CPU_USAGE% (seuil: $CPU_THRESHOLD%)"
log_message "$MESSAGE"
echo "$MESSAGE"
fi
# Vérification de l'utilisation mémoire
MEM_USAGE=$(free | grep Mem | awk '{print int($3/$2 * 100)}')
log_message "Utilisation mémoire: $MEM_USAGE%"
if [ $MEM_USAGE -gt $MEM_THRESHOLD ]; then
MESSAGE="ALERTE: Utilisation mémoire à $MEM_USAGE% (seuil: $MEM_THRESHOLD%)"
log_message "$MESSAGE"
echo "$MESSAGE"
fi
# Vérification de l'espace disque
DISK_USAGE=$(df -h / | grep / | awk '{print $5}' | cut -d% -f1)
log_message "Utilisation disque: $DISK_USAGE%"
if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
MESSAGE="ALERTE: Utilisation disque à $DISK_USAGE% (seuil: $DISK_THRESHOLD%)"
log_message "$MESSAGE"
echo "$MESSAGE"
fi
log_message "Fin de la vérification du système"
الأتمتة باستخدام Cron
Cron هو مجدوِل مهام يتيح تنفيذ السكربتات في أوقات محددة.
صيغة crontab
# Format crontab:
# .---------------- minute (0 - 59)
# | .------------- heure (0 - 23)
# | | .---------- jour du mois (1 - 31)
# | | | .------- mois (1 - 12)
# | | | | .---- jour de la semaine (0 - 6) (Dimanche=0)
# | | | | |
# * * * * * commande à exécuter
أمثلة على مهام cron
# Éditer votre crontab
crontab -e
أمثلة على المهام:
# Exécuter un script tous les jours à 3h du matin
0 3 * * * /chemin/vers/script.sh
# Exécuter une sauvegarde tous les lundis à 2h30
30 2 * * 1 /chemin/vers/backup.sh
# Exécuter un script toutes les 15 minutes
*/15 * * * * /chemin/vers/script.sh
# Exécuter un script le premier jour de chaque mois
0 0 1 * * /chemin/vers/script.sh
إدارة مخرجات cron
# Rediriger la sortie standard et d'erreur vers un fichier
0 3 * * * /chemin/vers/script.sh > /var/log/script.log 2>&1
# Ajouter la sortie à un fichier existant
0 3 * * * /chemin/vers/script.sh >> /var/log/script.log 2>&1
# Ignorer toute sortie
0 3 * * * /chemin/vers/script.sh > /dev/null 2>&1
# Envoyer la sortie par email (si configuré)
0 3 * * * /chemin/vers/script.sh | mail -s "Résultat du script" user@example.com
تقنيات متقدمة
معالجة النصوص باستخدام sed وawk
# sed - Éditeur de flux
sed 's/ancien/nouveau/g' fichier.txt # Remplacer toutes les occurrences
sed -i '5d' fichier.txt # Supprimer la ligne 5
sed -n '10,20p' fichier.txt # Afficher les lignes 10 à 20
# awk - Traitement de texte par colonnes
awk '{print $1}' fichier.txt # Afficher la première colonne
awk -F: '{print $1 " -> " $3}' /etc/passwd # Utiliser : comme délimiteur
awk '{sum += $1} END {print "Somme:", sum}' donnees.txt # Calculer une somme
التعابير النمطية
# Recherche avec grep et expressions régulières
grep '^[A-Z]' fichier.txt # Lignes commençant par une majuscule
grep -E '[0-9]{3}-[0-9]{3}-[0-9]{4}' # Format de numéro de téléphone
grep -v '^#' config.txt # Lignes qui ne sont pas des commentaires
الأتمتة باستخدام expect
#!/usr/bin/expect
# Automatiser les interactions interactives
spawn ssh utilisateur@serveur
expect "password:"
send "mot_de_passe\r"
expect "$ "
send "ls -la\r"
expect "$ "
send "exit\r"
expect eof
الخلاصة
تُعد البرمجة النصية في Bash والأتمتة من المهارات الأساسية لكل مستخدم للينكس. وبإتقان هذه التقنيات، يمكنك:
- توفير وقت كبير في المهام المتكررة
- تقليل الأخطاء البشرية
- إنشاء حلول مخصصة تلائم احتياجاتك الخاصة
- تحسين إنتاجيتك بشكل عام
ابدأ بسكربتات بسيطة، ثم انتقل تدريجيًا إلى حلول أكثر تعقيدًا كلما زادت ثقتك بنفسك. فالممارسة المنتظمة هي مفتاح الكفاءة في البرمجة النصية بلغة Bash.
ولا تنسَ أن التوثيق خير رفيق لك. استخدم man bash لاستكشاف جميع الميزات المتاحة، ولا تتردد في الاطلاع على الموارد الكثيرة المتوفرة على الإنترنت والمخصصة للبرمجة النصية بلغة Bash.
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش