[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Résolu] Manuel simple pour apprendre les scripts bash



Mercredi 15 juin 2005, 16:12:13 CEST, Frédéric BOITEUX a écrit :
> 
> Le Wed, 15 Jun 2005 09:34:16 -0400, Richard Lemay <lemrichard@yahoo.com>
> a écrit :
> 
> > J'ai fais un peu de lecture et j'ai construit le script suivant qui 
> > fonctionne bien:
> > 
> > 
> > #!/bin/sh
> > case "$1" in
> > 
> > "") /home/apps/acrobat-reader/bin/acroread
> > ;;
> > 
> > *) /home/apps/acrobat-reader/bin/acroread "$1"
> > ;;
> > 
> > esac
> 
> Oui, mais si tu as plusieurs fichiers en arguments ?
> 
> > Sauf que cette commande (acroread ${1+"$@"} m'intrigue. Elle semble 
> > faire exactement ce que je veux en une ligne. Je vais devoir trouver
> > de  la documentation pour me l'expliquer :).
> 
> Elle fait je crois exactement ce que tu veux, mais c'est assez
> illisible. C'est une formule "connue" que j'avais pêché dans un script,
> et que je garde  sous le coude. Mais je n'en ai pas vu d'explication
> dans la page manuel de 'bash'...

Mais si on la trouve, dans la section « EXPANSION », sous-section
« remplacement des paramètres ». (En anglais : EXPANSION/Parameter
expansion.)

Voilà un résumé : 
${1+"$@"} = si $1 n'existe pas, on ne met rien, sinon on met "$@"
($@ = tous les arguments, les guillemets permettent de protéger les
arguments un par un (c'est comme si on écrivait "$1" "$2" ...)).

(À noter que, normalement, c'est ${1:+"$@"}.)

En général, "$@" me suffit. Je ne me souviens pas avoir eu de problème
s'il n'y avait pas du tout d'argument.

La gestion des guillemets est toujours assez... amusante... à comprendre.

for f in *.txt; do cat $f; done

for f in "*.txt"; do cat $f; done

for f in *.txt; do cat "$f"; done

for f in "*.txt"; do cat "$f"; done

Et si on y ajoute les ''... ;oP

-- 
Sylvain Sauvage



Reply to: