1 Syntaxe de base du shell
1.1 Affectation de variables sans espaces
correcte :
val1=1
msg="bonjour"
ref=${msg} # Référence sans accolades si sans ambiguïté
incorrecte :
val1 = 1
msg = "bonjour"
1.2 Conditions if avec espaces dans les crochets
correcte :
if [ ! -d "${repertoire_local}" ]; then
echo "Répertoire inexistant : ${repertoire_local}"
fi
1.3 Structures conditionnelles et boucles
1.3.1 if, elif, else, fi
if [ -d ${rep_courant} ]; then
rep_defini=${rep_courant}
if [ -d ${rep_valide} ]; then
mv ${rep_valide}/*.txt ${rep_courant}
echo "rep_valide=${rep_valide}"
rm -rf ${rep_valide}
fi
elif [ -d ${rep_valide} ]; then
rep_defini=${rep_valide}
else
echo "Aucun répertoire trouvé !"
exit 1
fi
Vérification d'une sous-chaîne :
if [[ "${tableau[$index]}" =~ "-" ]]; then
# Traitement
fi
1.3.2 Boucle for
for idx in ${!tab[@]} # idx est l'indice de l'élément
do
echo "${tab[$idx]}" # Affiche chaque élément via son indice
done
Exemple en une ligne :
for i in seq 0 `expr ${#tab1[@]} - 1` ;do tab2[$i]=0 ;done
1.3.3 Boucle while
while true ; do
echo $compteur
break
done
1.3.4 Structure case pour les arguments
initialiser() {
OPTIONS=`getopt -o -I:-u:-p:h -l IP:,utilisateur:,motdepasse:,aide -- "$@"`
if [ "$?" -ne 0 ]; then
echo "Erreur d'option, sortie"
usage
exit 1
fi
eval set -- "${OPTIONS}"
delai_attente=30
journal="$HOME/transfert.log"
while true ; do
case "$1" in
-I|--IP)
ADRESSE_IP="$2" ; shift ;;
-u|--utilisateur)
UTILISATEUR="$2" ; shift ;;
-p|--motdepasse)
MOTDEPASSE="$2" ; shift ;;
-h|--aide)
usage ; exit 0 ;;
--)
shift ; break ;;
*)
echo "Option invalide ! Sortie"
exit 1 ;;
esac
shift
done
}
1.3.5 Parcourir les lignes d'un fichier
while read ligne
do
echo $ligne
done < $NOM_FICHIER
2 Manipulation des variables
2.0 Variables spéciales
$$ PID du shell courant
$! PID du dernier processus en arrière-plan
$? Code de retour de la dernière commande
$* Liste de tous les arguments (chaîne unique)
$@ Liste de tous les arguments (séparés)
$# Nombre d'arguments passés
$0 Nom du fichier script
$1 à $n Arguments individuels
2.1 Affectation de variables
msg="Salut monde"
copie=$msg # copie vaut "Salut monde"
sortie=$(echo $msg) # Capture la sortie standard
alt_sortie=`echo $msg` # Méthode alternative
Dans les scripts shell, les variables sont globales par défaut.
2.2 Extraction de sous-chaînes
echo ${NOM_SERVICE} # Exemple : LY-test-1
echo ${NOM_SERVICE#*-} # test-1
echo ${NOM_SERVICE##*-} # 1
echo ${NOM_SERVICE%-*} # LY-test
echo ${NOM_SERVICE:1} # Y-test-1
echo ${NOM_SERVICE:1:3} # Y-t
echo ${NOM_SERVICE/LY-/lv} # lvtest-1
echo ${NOM_SERVICE//t/T} # LY-TesT-1
echo ${NOM_SERVICE: -1} # 1 (avec espace avant -1)
2.3 Remplacemant dans les variables
texte="abc-12345-abc"
echo ${texte/abc/ABC} # ABC-12345-abc
echo ${texte/#abc/ABC} # ABC-12345-abc (début)
echo ${texte/%abc/ABC} # abc-12345-ABC (fin)
2.4 Comparaison de chaînes
if [[ "123abc456" =~ "abc" ]]; then
echo "Succès"
fi
2.5 Tableaux
2.5.1 Longueur
longueur=${#tableau[@]}
2.5.2 Copie
copie_tab=(${tableau[@]})
2.5.3 Affichage
echo ${copie_tab[@]} # Tous les éléments
echo ${copie_tab} # Premier élément seulement
2.5.4 Ajout d'éléments
tableau[${#tableau[@]}]=valeur
2.5.5 Tranche de tableau
tableau=(1 2 3 4 5 6 7)
echo ${tableau[@]} # Tout le tableau
echo ${tableau[@]:0:2} # Éléments 0 à 1
2.6 Calculs arithmétiques
resultat=$((nombre + 2))
2.7 Exécution de commandes via variables
commande="bash /home/utilisateur/script.sh 50 7"
$commande # Exécution directe
3 Exemples avec sed
3.1 Extraire entre deux motifs
cat donnees.txt | sed -n '/Début/,/Fin/p'
3.2 Nettoyage et extraction
Extraire le nombre le plus à droite, par exemple :
echo "Num: 5 Index: 2 Port: 10 Routes: 8" | sed 's/.*Routes:[[:space:]]*\([0-9]\+\)/\1/g'
3.3 Insertion autour d'une ligne
sed -i "/ligne_cible/a\après cible" fichier.txt
sed -i "/ligne_cible/i\avant cible" fichier.txt
3.4 Supprimer une plage de lignes
sed -i '10,15d' configuration.ini
3.5 Suprimer après un motif
sed -i '/\[section\]/,$d' config.ini
3.6 Afficher après un motif
sed -n '/\[section\]/,$p' config.ini
4 Utilisation de awk
Exemple 1 : Obtenir un PID spécifique
ps -elf | grep processus | grep -v grep | awk '{print $4}'
Exemple 2 : Comparaison numérique
awk -v val_util=${Utilisation%?} -v seuil=50 'BEGIN{print(val_util>seuil)?1:0}'
Exemple 3 : Compter les champs
echo "champ1,champ2,champ3" | awk -F ',' '{print NF}'
5 Astuces pour les outils shell
5.1 top en mode non enteractif
top -n 1 -b | grep '%Cpu(s)' | sed 's/.* \([0-9]\+.[0-9]\+\) id.*/\1/g'
5.2 Gestion des paquets rpm
rpm -Uvh *.rpm --nodeps --force # Installation forcée
rpm -ivh paquet # Installer un paquet
rpm -qa | grep paquet # Lister les paquets installés
rpm -e --nodeps paquet # Désinstaller
5.3 Utilisation de yum
yum install --downloadonly --downloaddir=./depot paquet # Téléchargement sans installation
yum deplist paquet # Voir les dépendances
yum -y install yum-utils # Installer les utilitaires
repotrack outil # Télécharger toutes les dépendances
5.4 Services système
chkconfig --list # Lister les services
ls /etc/init.d # Alternative
5.5 Montage de systèmes de fichiers
umount /point/montage
5.6 Informations sur les mots de passe
chage -l utilisateur
5.7 Formatage de dates
date '+%Y-%m-%d %H:%M:%S'
5.8 Lecture d'entrées
IFS_OLD=${IFS}; IFS=,;
read var1 var2 <<< $(echo "$*"); IFS=${IFS_OLD}
5.9 Création rapide de fichiers
seq 1 10 | xargs -i touch fichier.{}
6 Techniques avancées
6.1 Trouver une interface réseau par IP
ip -br address | grep 192.168.1.100 | awk '{print $1}' | cut -d@ -f1
6.2 Transfert de fichiers via lftp
lftp -u ${USER},${MOTDEPASSE} sftp://${ADRESSE}:${PORT} << EOF
mkdir -p ${CHEMIN_DISTANT}
cd '${CHEMIN_DISTANT}'
put ${FICHIER_SOURCE}
bye
EOF
6.3 Processus watchdog
timeout() {
commande=$*
$commande >> $journal &
pid_commande=$!
temps_actuel=$(date +%s)
temps_restant=$[ ${delai_attente}-($temps_actuel-$debut) ]
if [ ${temps_restant} -lt 0 ]; then
temps_restant=0
fi
( sleep ${temps_restant} ; kill -9 $pid_commande > /dev/null 2>&1) &
pid_watchdog=$!
wait $pid_commande > /dev/null 2>&1
retour=$?
if [ $retour -ne 0 ]; then
exit 1
fi
}
6.4 Exécution distante via SSH
identifiant=$(ssh utilisateur@host "sudo su -c 'docker ps | grep conteneur'" | head -n 1 | awk '{print $1}')
6.5 Vérifier l'heure de création sur XFS
ls -i ${chemin_fichier}
df -T ${chemin_fichier}
xfs_db -r -c "inode 123456" -c "p v3.crtime.sec" /dev/sda1
6.6 Surveiller les E/S disque
iostat -x 1 10
iotop -oP
pidstat -d 1
7 Modification des bibliothèques avec patchelf
patchelf --force-rpath --set-rpath "$chemin_lib" "$fichier_so"
patchelf --set-interpreter "$chemin_lib" "$fichier_so"
patchelf --print-rpath "$fichier_so"