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

Aller à exercices

Liens utiles

Guide de l’écriture avancée de scripts bash
Validation de scripts