script shell : exemples
Manipulation de chaines de caractères
Comme d’habitude sous Unix (et particulièrement en shell), il existe différentes manières de manipuler des chaines de caractères.
En utilisant les possibilités des shells modernes :
Ces méthodes ne sont absolument pas standard, et ne fonctionneront probablement pas avec des shells basiques.
Déterminer la longueur d’une variable chaine:
ch='une chaine' #initialisation de la variable ch echo ${#ch} #retourne 10
Extraire une partie d’une chaine:
ch='une chaine' #initialisation de la variable ch echo ${ch:5} #retourne la sous-chaine depuis le 5° caractère jusqu'à la fin #soit la sous-chaine haine echo ${ch:5:2} #retourne les 2 caractères depuis la position 5 #soit la sous-chaine ha
En utilisant la commande expr :
Si le script doit fonctionner avec n’importe quel shell, il vaut alors mieux faire appel à la commande expr (bien évidemment le fonctionnement sera plus lent).
Déterminer la longueur d’une variable chaine:
ch='une chaine' #initialisation de la variable ch echo `expr length $ch` #retourne 10 echo $(expr length $ch : '.*') #retourne 10 #avec cette seconde forme il est possible de rechercher la longueur d'un motif (expression rationnelle)
Extraire une partie d’une chaine:
ch='une chaine' #initialisation de la variable ch echo $(expr substr "$ch" 5 6) #retourne la sous-chaine constituée des 6 caractères depuis le 5° caractère
calculs arithmétiques (basée sur bc)
#!/bin/bash if [ $1 = "-p" ] ; then precision=$2 shift 2 else precision=2 fi bc -q <<EOF scale=$precision $* quit EOF
Utilisations :
calculer 1/3
NUM=$(calculer -p 5 .123456*10)
calcul du remboursement d’un prêt
#!/bin/bash function calculer() { if [ $1 = "-p" ] ; then precision=$2 shift 2 else precision=2 fi bc -q <<EOF scale=$precision $* quit EOF return 0 } if [ $# -ne 3 ] ; then echo "Script de calcul des remboursements d'un prêt." echo "Syntaxe: $0 <capital> <taux d'intérêt> <années>" >&2 exit 1 fi P=$1 I=$2 L=$3 J="$(calculer -p 8 $I / \( 12 \* 100 \) )" N="$(($L*12))" M="$(calculer -p 8 $P \* \($J \/ \( 1 - \( 1 + $J \) \^ - $N \) \) )" T=$(calculer -p 2 $M \* $L \* 12) euros=$( echo $M | cut -d. -f1) echo $euros cents=$(echo $M | cut -d. -f2 | cut -c1-2) echo $cents cat <<FIN Le prêt de $P € sur $L ans à $I% d'intérêt suppose un remboursement de $euros,$cents € chaque mois pendant toute la durée du prêt (soit $N mensualités). La somme totale remboursée, sera de $T €. FIN
utilisation : ./pret.sh 1000 10 1
Vérification des quotas disque des utilisateurs
#!/bin/bash # Limite d'utilisation (en Mo) par utilisateur MAXDISKUSAGE=20 for name in $(cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 999{print $1}') do echo -n "L'utilisateur $name dépasse son quota disque. espace occupé : " find /home -user $name -xdev -type f -ls | \ awk '{ sum += $7} END{ print sum / (1024*1024) " Mo"}' done | awk "\$9 > $MAXDISKUSAGE { print \$0}" exit 0
Parcours d’un fichier texte
Il peut être quelquefois utile de pouvoir traiter un fichier texte ligne par ligne.
Le parcours peut être effectué de la façon suivante :
#!/bin/bash
[ $1 ] || exit 1
[ -r $1 ] || exit 2
# boucle while de lecture du fichier fourni en argument 1
while read LIGNE
do
echo "$LIGNE"
done < $1
Transfert FTP
La principale utilité de ce script est de voir comment on peut utiliser un programme interactif depuis un script :
#!/bin/bash $FTP_SERVEUR="monserveur.mondomaine.tld" $FTP_USER="user" $FTP_PASSWD="password" $REP_SAUVEGARDE="/home/user/sauvegarde" $FICHIER_A_TRANSFERER="un_fichier" /usr/bin/ftp -i -n $FTP_SERVEUR > /dev/null 2>&1 << END_FTP quote USER $FTP_USER quote PASS $FTP_PASSWD lcd $REP_SAUVEGARDE/ bin put $FICHIER_A_TRANSFERER quit END_FTP
Liens utiles
Guide de l’écriture avancée de scripts bash
Validation de scripts