[gull] Questions sur un script bash

Félix Hauri felix at f-hauri.ch
Fri Aug 13 09:14:02 CEST 2004


On Fri, Aug 13, 2004 at 12:02:50AM +0200, Félix Hauri wrote:
> On Thu, Aug 12, 2004 at 01:44:47AM +0200, Stéphane Graber wrote:
> > Le Thu, Aug 12, 2004 at 01:16:31AM +0200, WaVeR a ecrit :

Je m'aperçois que je répond aux réponses mais pas directement à la question
...

> > > Le jeu 12/08/2004 à 00:37, Chris De Bleu a écrit :
> > > > bonjour,
> > > > 
> > > > Sous bash, j'ai recupere de la lecture d'un fichier la
> > > > ligne suivante
> > > > dd 2 2 0 40 ~488 40 POB /dev/chunk
> > > > et je voudrais lire le nombre 488. J'ai fait ceci
> > > > 
> > > > nn=`head -1 myfile |awk '{print $6}'`
> > > > 
> > > > le probleme, c'est que j'obtiens ~488 et c'est normal.
> > > > 
> > > > Comment faire pour avoir seulement 488?

La question était:
``comment me débarasser d'un caractère encombrant dans une chaine en bash?''

La man page de bash est assez lourde, mais dans le chapitre ``EXPANSION''
(je regarde la version française de la man page), tu trouveras un sous-chapitre
``Remplacement des paramètres'', dans lequel tu verra les syntaxes:
--- extrait de man bash ---
  ${paramètre#mot}
  ${paramètre##mot}
     Le mot est développé pour fournir un motif, comme dans l'expansion des noms 
     de fichiers. Si le motif correspond au debut de la valeur du paramètre, alors 
     le développement prend la valeur du paramètre après suppression du plus 
     petit motif commun (cas ``#''), ou du plus long motif (cas ``##'')....
...
  ${paramètre%mot}
  ${paramètre%%mot}
...
--- fin d'extrait ---

dont l'effet sera la même mais à partir de la fin.

Dans ton cas, le ``~'' étant un mot réservé, tu devras l'échaper: ``\~''.
  ${nn#\~}

Si tu n'est pas sûr de la présence d'un tilde, mais que cela puisse être un autre 
caractère, alors:
  ${nn#?}

Autre méthode, juste un poil plus tôt dans le même chapitre, l'explication de
--- extrait de man bash ---
  ${paramètre:début}
  ${paramètre:début:longueur}
     Extraction de sous-chaîne Se développe pour fournir la sous-chaîne de la 
     *longueur* indiquée (en caractères) commençant par *début*.
--- fin d'extrait ---

Soit, dans ton cas,
  ${nn:1}

> 1: Uniquement bash (sans autre binaire: head, awk, sed, etc.):
>    $ read -a nn <myfile
>    $ echo ${nn[5]#\~}
>    488

ou selon ce que je viens de dire:
 $ read -a nn <myfile
 $ echo ${nn[5]:1}
 488

Comme quoi, il n'y a pas qu'une solution... 

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list