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

Re: [bash] expansion de variable avec double quote



The Tuesday 06 January 2009 09:57:41 hd, you wrote :
> Bonjour,
>
> Je rencontre un problème avec l'expansion des variables sous bash
>
> J'utilise un script (que je ne peux modifier car il fait partie d'un
> package tiers) qui lance un ./configure en lui passant des paramamètres
> additionnels via une variable MY_ARGS
>
> le script est quelque chose comme :
>
> #!/bin/sh
> ....
> ./configure ${MY_ARGS}
> ...
>
> et je le lance avec la commande :
> MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh

En fait les ' sont retirer par le shell au moment de l'évaluation de la ligne.

Au final il mettra dans MY_ARGS : --enable-truc CFLAGS="-g3 -O0" ./script.sh

Ensuite quand tu appelles configure avec $MY_ARGS la variable est remplacée 
par sa signification (Cf ligne du dessus) et le découpage est fait suivant 
les espaces sauf pour les variables qui étaient entre quites.

Cf man bash : Expansion  is  performed  on  the  command  line after it has 
been split into words.  There are seven kinds of expansion performed: brace 
expansion, tilde expansion, parameter and variable expansion, command 
substitution, arithmetic expansion, word splitting, and pathname expansion.

Puis plus loin : 

The shell scans the results of parameter expansion, command substitution, and 
arithmetic expansion that did not occur within double quotes for word 
splitting.

Autrement dit les quotes ne sont interprétés que dans la ligne de commande, 
pas dans les variables. Toute quote dans une variable est considérée comme un 
caractère (c'est comme si la quote avait été échappée par le shell).

Si tu veux obtenir le résultat espéré tu vas devoir faire un eval : 

val [arg ...]
              The args are read and concatenated together into a single 
command.  This command is then read and executed by the shell, and its exit 
status  is  returned  as the value of eval.  If there are no args, or only 
null arguments, eval returns 0.

Ce qui dans ton cas donne : 

MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh

puis

eval ./configure ${MY_ARGS}

>
> je m'attends à ce qu'il soit interprété comme :
>     ./configure --enable-truc CFLAGS="-g3 -O0"
>
> mais bash le transforme en :
>     ./configure --enable-truc 'CFLAGS="-g3' '-O0"'
> ce qui fait 3 paramètres pour "./configure" au lieu de 2
> et évidemment ./configure sort en erreur en indiquant qu'il ne comprend
> pas le paramètre -O0
>
> Pourriez vous m'indiquer la bonne syntaxe pour que bash fasse ... ce que
> je voudrais qu'il fasse
>
> merci


Cordialement,

Thomas Preud'homme

-- 
Why debian : http://www.debian.org/intro/why_debian

Attachment: signature.asc
Description: This is a digitally signed message part.


Reply to: