Forum Programmation.shell La bonne façon de gérer les options et arguments dans un shell

Posté par  .
Étiquettes : aucune
0
8
avr.
2007
J'ai recherché assez longuement comment créer un script shell capable de gérer de multiples options facultatives ainsi que de multiples arguments.

J'ai finalement trouvé des solutions intéressantes que je souhaite partager ici.

On pourra facilement réutiliser la structure de ce script pour d'autres applications.

Merci aux divers contributeurs de proposer d'éventuelles corrections ou améliorations (notamment, par exemple une gestion des erreurs avec retour de code d'erreur numérique).

Voici le script en question :


#!/bin/bash
#
# Fichier : /usr/bin/reduit
# Droits : rwxr-xr-x
# Proriétaire : root:root
#
#
# Shell script pour redimensionner les images d'un répertoire.
# Aide : Taper reduit (sans arguments)
#
# Créé par :
# Anatole, le 08/04/2007.


# Paramètres par défaut :
# -----------------------

SIZE=1024
QUALITY=80
OUTPUTDIR="/tmp/imagesReduites"
PREFIX="r"
POSTFIX="_"

# Affiche l'aide :
# ----------------

function print_usage()
{
echo "Usage :"
echo "$0 [ -s SIZE] [ -q QUALITY ] [ -o OUTPUTDIR ] fichiers"
echo "$0 réduit une image à la largeur indiquée par SIZE (en pixels) \
et à la qualité JPG indiquée par QUALITY (de 0:meilleure qualité \
à 100:meilleure compression)."
echo " "
echo "Valeurs par défaut :"
echo " "
echo "SIZE : $SIZE"
echo "QUALITY : $QUALITY"
echo "OUTPUTDIR : $OUTPUTDIR"
}

# -------------------------------------------------------------
# Début du script
# -------------------------------------------------------------

# Si pas d'argument, on affiche l'aide
# ------------------------------------
if [ "$1" == "" ] ; then
print_usage
exit 0
fi

# Si des options sont choisies, on les utilise
# --------------------------------------------
while getopts s:q:o:h option
do
case $option in
s) SIZE=$OPTARG ;;
q) QUALITY=$OPTARG ;;
o) OUTPUTDIR=$OPTARG ;;
?) print_usage ;;
esac
done
# On passe l'index $OPTIND aux arguments donnés après les options
shift $(($OPTIND - 1))

# Boucle sur les différents noms de fichiers donnés en arguments
# --------------------------------------------------------------

# (Attention, un seul argument peut représenter plusieurs fichiers
# Exemple : reduit *.jpg *.JPG)

for filename in $@
do
for img in `find $filename`
do
# Si la cible existe, on passe à la suivante
if [ -f ${OUTPUTDIR}/${PREFIX}${SIZE}${POSTFIX}$img ] ; then
echo "${OUTPUTDIR}/${PREFIX}${SIZE}${POSTFIX}$img existe déjà -> Ignoré."
else
echo "convert $img vers ${OUTPUTDIR}/${PREFIX}${SIZE}${POSTFIX}$img en cours..."
convert -resize $SIZE -quality $QUALITY $img ${OUTPUTDIR}/${PREFIX}${SIZE}${POSTFIX}$img
fi
done
done
  • # Mes 2cents

    Posté par  . Évalué à 3.

    Salut,

    Effectivement, getopts est une des meilleures solutions existantes.

    Par contre pour le usage, j'aime bien utiliser tset (man tset) qui permet de mettre des parties en gras par exemple.

    Voilà
  • # valeur par défaut

    Posté par  . Évalué à 2.

    Un idiome assez pratique en bash: echo "i=${i:-3}"
    Ex:
    left@monkey:~$ echo "i=${i:-3}"
    i=3
    left@monkey:~$ i=7;echo "i=${i:-3}"
    i=7

    C'est notamment très pratique quand le script est destiné à être sourcé par un autre.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.