Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fais la poule aka "quote quote"

3 réponses
Avatar
clara
Bonjour à tous,

Encore une fois, je m'en remets à vous pour un probleme de shell unix.

Voici mon histoire...

Directement depuis le prompt, je peux lancer la commande suivante qui
fonctionne :

# commande.exe "coucou;moi" PATTERN PATTERN.txt 1 1 20

La syntaxe est importante, et je souhaite scripter l'execution de cette
commande en recuperant les options dans un fichier.

- J'ai testé quelques trucs. Lorsque le script est de la forme (sans
backquote donc) :

#!/bin/sh
set -x
cat file.conf | grep -w $1 | awk '{ print
"commande.exe","\""$1"\"",$2,$9".txt","1","1","20"}'

Voici ce que j'obtiens :
./script.sh PATTERN
++ cat file.conf
++ grep -w PATTERN
++ awk '{ print "commande.exe","\""$1"\"",$2,$9".txt","1","1","20"}'
commande.exe "coucou;cmoi" boubou PATTERN.sce 1 1 20

Ma commande est juste affichée et la syntaxte est tout à fait correcte.

- Lorsque le script est (ligne entre backquote) :
#!/bin/sh
set -x
`cat file.conf | grep -w PATTERN | awk '{ print
"commande.exe","\""$1"\"",$2,$9".txt","1","1","20"}'`

Le resultat est :
./script.sh PATTERN
++ cat file.conf
++ grep -w PATTERN
++ awk '{ print "commande.exe","\""$1"\"",$2,$9".txt","1","1","20"}'
++ commande.exe '"coucou;cmoi"' boubou PATTERN.sce 1 1 20
La commande ne fonctionne pas

La commande est lancée (ce que je souhaite) mais la syntaxe n'est pas
bonne à cause de ces quotes qui viennent entourer les guillemets.

Je souhaite donc pouvoir lancer ma commande depuis un script.

Merci à vous.

3 réponses

Avatar
Stephane Chazelas
On Wed, 13 Feb 2008 17:28:53 +0100, clara wrote:
[...]
#!/bin/sh
set -x
cat file.conf | grep -w $1 | awk '{ print
"commande.exe","""$1""",$2,$9".txt","1","1","20"}'

Voici ce que j'obtiens :
./script.sh PATTERN
++ cat file.conf
++ grep -w PATTERN
++ awk '{ print "commande.exe","""$1""",$2,$9".txt","1","1","20"}'
commande.exe "coucou;cmoi" boubou PATTERN.sce 1 1 20

Ma commande est juste affichée et la syntaxte est tout à fait correcte.


Oui, c'est une syntaxe qui pourrait etre interpretee par un
shell.

- Lorsque le script est (ligne entre backquote) :
#!/bin/sh
set -x
`cat file.conf | grep -w PATTERN | awk '{ print
"commande.exe","""$1""",$2,$9".txt","1","1","20"}'`

Le resultat est :
./script.sh PATTERN
++ cat file.conf
++ grep -w PATTERN
++ awk '{ print "commande.exe","""$1""",$2,$9".txt","1","1","20"}'
++ commande.exe '"coucou;cmoi"' boubou PATTERN.sce 1 1 20
La commande ne fonctionne pas

La commande est lancée (ce que je souhaite) mais la syntaxe n'est pas
bonne à cause de ces quotes qui viennent entourer les guillemets.
[...]


`xxx` ou $(xxx)

ne fait pas en sorte que l'output de xxx soit interpreté comme
du code shell. Encore heureux, sinon, ca voudrait dire que:

echo `echo 'foo; rm -rf $HOME'`

effacerait ton home-directory.

Non, `xxx` est decoupé en une list de mots suivant $IFS et
ensuite chaque mot est sujet a filename generation. Et ca donne
une liste d'arguments. Le premier est utilisé pour determiner la
commande a executer.

Les quotes ci-dessus ne sont ajoutee que pour l'affichage de set
-x pour bien montrer les arguments.

Donc, soit:

eval "$(
grep -w PATTERN < file.conf | awk '
{ print "commande.exe "" $1 "" " $2 " " $9 ".txt 1 1 20"}'
)"
(eval permet d'interpreter une chaine de caracteres dans le
shell courant).

Soit:
grep -w PATTERN < file.conf | awk '
{print "commande.exe "" $1 "" " $2 " " $9 ".txt 1 1 20"}' | sh
(la c'est un autre shell qui l'interprete)

soit par exemple:

set -f # disable filename generation
IFS='|' # separateur plus pratique que celui par defaut (espaces)
$(grep -w PATTERN < file.conf | awk '
{print "commande.exe|" $1 "|" $2 "|" $9 ".txt|1|1|20"}')

Note que -w n'est pas une option standard de grep donc, tu peux
aussi bien faire:

$(< file.conf gawk '
/<PATTERN>/ {
print "commande.exe|" $1 "|" $2 "|" $9 ".txt|1|1|20"
}')

--
Stephane

Avatar
clara
Stephane Chazelas wrote:
eval "$(
grep -w PATTERN < file.conf | awk '
{ print "commande.exe "" $1 "" " $2 " " $9 ".txt 1 1 20"}'
)"
(eval permet d'interpreter une chaine de caracteres dans le
shell courant).


La premiere solution me va tres bien.

Un grand merci de ton aide et de toutes ces explications.

A++

Avatar
Cyrille Lefevre
Bonjour à tous,

Encore une fois, je m'en remets à vous pour un probleme de shell unix .

Voici mon histoire...

Directement depuis le prompt, je peux lancer la commande suivante qui
fonctionne :

# commande.exe "coucou;moi" PATTERN PATTERN.txt 1 1 20

La syntaxe est importante, et je souhaite scripter l'execution de cette
commande en recuperant les options dans un fichier.

- J'ai testé quelques trucs. Lorsque le script est de la forme (sans
backquote donc) :
[snip]


Ma commande est juste affichée et la syntaxte est tout à fait corre cte.

- Lorsque le script est (ligne entre backquote) :
[snip]


La commande est lancée (ce que je souhaite) mais la syntaxe n'est pas
bonne à cause de ces quotes qui viennent entourer les guillemets.

Je souhaite donc pouvoir lancer ma commande depuis un script.

Merci à vous.



Hi, Bonjour,

au choix :

grep -w "$1" file.conf | awk ... | sh

ou

eval $(grep -w "$1" file.conf | awk ...)

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.