Bash - Tips for scripting
Alasta 18 Octobre 2014 bash bash CentOS Linux Open Source script
Description : Nous allons voir quelques exemples de pattern-matching, pipelines, ...
Extraction de patterns :
${VAR} # valeur de VAR ${#VAR} # taille de VAR ${VAR#pattern} # VAR amputé du pattern mini en prefix ${VAR##pattern} # VAR amputé du pattern max en prefix ${VAR%pattern} # VAR amputé du pattern mini en suffix ${VAR%%pattern} # VAR amputé du pattern max en suffix ${VAR:-word} # Affiche word si VAR est nulle ou unset ${VAR:=word} # Affiche word si var est nulle ou unset et set assigne word à var ${VAR:?} # Affiche une erreur si VAR est nulle ou unset ${VAR:+word} # Affiche word si VAR est différente de nulle et définie ${VAR:offset} # Affiche VAR à partir de l'offset ${VAR:offset:lenght} # Affiche VAR à partir de l'offset sur lenght de longeur ${!tab[@]} # Liste les id du tableau tab ${tab[#_ID]} # Affiche la valeur du #_ID de tab ${VAR/pattern/string} # Substitution ${VAR^} # Maj du premier caractère ${VAR^^} # Maj de tous les caractères ${VAR,} # Min du premier caractère ${VAR,,} # Min de tous les caractères ${#tab[*]} # Affiche le nombre d'entrée dans le tableau
$ FILE="/usr/lib64/coreutils/libstdbuf.so" $ echo ${#FILE} 33 $ echo ${FILE#/*/} lib64/coreutils/libstdbuf.so $ echo ${FILE##/*/} libstdbuf.so $ echo ${FILE%/*} /usr/lib64/coreutils $ echo ${FILE%%/*} $ echo ${FILE%.so} /usr/lib64/coreutils/libstdbuf
$ NAMES="barney:ted:lily:robin:marshall" $ echo ${NAMES#*:} # remove shortest prefix matching "*:" ted:lily:robin:marshall $ echo ${NAMES##*:} # remove longest prefix matching "*:" marshall $ echo ${NAMES%:*} # remove shortest suffix matching ":*" barney:ted:lily:robin $ echo ${NAMES%%:*} # remove longest suffix matching ":*" barney
Redirections :
cmd > file # Redirige stdout de cmd dans file cmd 2> file # Redirige stderr de cmd dans file cmd &> file # Redirige stdout et sterr de cmd dans file cmd < file # Envoi le contenu de file dans cmd cmd 2> /dev/null # Redirige sterr dans un trou noir cmd > file.out 2> file.err # Redirige stdout dans file.out et stderr dans file.err cmd1 | cmd2 # Redirection stdout de cmd1 dans stdin de cmd2. stderr n'est pas transmit dans les | cmd1 | cmd2 | cmd3 | cmd4; echo ${PIPESTATUS[@]} # Suite de redirections et récupération des > file # Vide et/ou crée un fichier cmd | tee cmd.out | sort | tee sort.out # Un fichier de sortie par cmd (cmd1; cmd2) > file # stdout des 2 cmd dans file (via sous shell) { cmd1; cmd2; } > file # stdout des 2 cmd dans file (sans sous shell) cmd1; cmd2 # Execution cmd1 puis cmd2 cmd1 && cmd2 # Execution de cmd2 si cmd1 est OK cmd1 || cmd2 # Execution de cmd2 si cmd1 est non OK #------------------------------------- >> ajoute au lieu de rediriger.
Pipelines :
Symbole | Connexion | Détails |
---|---|---|
; | Séquencement | La seconde opération ne commence qu'après la première. |
& | Parallélisme | La première opération est lancée en arrière-plan et la seconde démarre simultanément; elles n'ont pas d'interactions entre elles. |
&& | Dépendance | La seconde n'est exécutée que si la première renvoie un code de retour succès. |
|| | Alternative | La seconde opération n'est exécutée que si la primère retourne un code retour d'échec. |
Conditions et tests :
Option | Vrai si |
---|---|
-b fichier | Le fichier est de type block. |
-c fichier | Le fichier est de type caractère. |
-d repertoire | Le répertoire indiqué existe. |
-e fichier | Le fichier indiqué existe. |
-f fichier | Le fichier indiqué est un fichier régulier. |
-g fichier | Le bit Set-GID du fichier indiqué est positionné. |
-h fichier -L fichier | Le fichier indiqué est un lien symbolique. |
-G fichier | "Le fichier indiqué appartient au même groupe que le GID effectif du processus invoquant la commande test." |
-k fichier | Le bit Sticky du fichier indiqué est positionné. |
-n chaine | La longueur de la chaîne indiquée est non nulle. |
-N fichier | Le fichier a été modifié depuis son dernier accès en lecture. |
-O fichier | "Le fichier indiqué appartient au même utilisateur que l’UID effectif du processus invoquant la commande test." |
-p fichier | Le fichier indiqué est un tube nommé (file FIFO). |
-r fichier | Le fichier indiqué est lisible. |
-s fichier | La taille du fichier indiqué est non nulle. |
-S fichier | Le fichier indiqué est une socket. |
-t descripteur | Le descripteur de fichier correspond à un terminal. |
-u fichier | Le bit Set-UID du fichier indiqué est positionné. |
-w fichier | On peut écrire dans le fichier indiqué. |
-x fichier | Le fichier indiqué est exécutable. |
-z chaine | La longueur de la chaîne indiquée est nulle. |
chaine | La chaîne est non nulle. |
chaine_1 = chaine_2 | Les deux chaînes sont identiques. |
chaine_1 != chaine_2 | Les deux chaînes sont différentes. |
chaine_1 < chaine_2 | La première chaîne apparaît avant la seconde, dans un tri lexicographique croissant. |
chaine_1 > chaine_2 | La première chaîne apparaît après la seconde, dans un tri lexicographique croissant. |
valeur_1 -eq valeur_2 | Les deux valeurs arithmétiques sont égales. |
valeur_1 -ge valeur_2 | La première valeur est supérieure ou égale à la seconde. |
valeur_1 -gt valeur_2 | La première valeur est strictement supérieure à la seconde. |
valeur_1 -le valeur_2 | La première valeur est inférieure ou égale à la seconde. |
valeur_1 -lt valeur_2 | La première valeur est strictement inférieure à la seconde. |
valeur_1 -ne valeur_2 | Les deux valeurs arithmétiques sont différentes. |
fichier_1 -ef fichier_2 | Le fichier_1 est le même que le fichier_2. Il peut s’agir de deux noms (liens physiques)
différents dans le système de fichiers, correspondant au même contenu sous-jacent. La comparaison concerne le numéro de périphérique de support et le numéro d’i-noeud. |
fichier_1 -nt fichier_2 | 2 La date de dernière modification du fichier_1 est plus récente que celle du fichier_2. |
fichier_1 -ot fichier_2 | La date de dernière modification du fichier_1 est plus ancienne que celle du fichier_2. |