OVH Cloud OVH Cloud

Scripts (essai)

3 réponses
Avatar
ROT13
Bonjour,

Quelqu'un pet il m'expliquer pourquoi le résultat de ces 2 petit scripts
sont différents ?

Script 1
========
#!/bin/bash
host="http://www.tr.com/"
truc=`echo $host | sed 's/\\./\\\\\./g'|sed 's/\//\\\\\//g' `
echo $truc

resultat 1
==========
http:\/\/www\.tr\.com\/


Script 2 (lancé dans le term)
========
echo "http://www.tr.com/" | sed 's/\\./\\\\\./g'|sed 's/\//\\\\\//g'


resultat 2
==========
http:\\/\\/www.tr.com\\/


Merci

3 réponses

Avatar
JRD
ROT13 wrote:
Bonjour,


Bonjour

Quelqu'un pet il m'expliquer pourquoi le résultat de ces 2 petit scripts
sont différents ?

Script 1
======= > #!/bin/bash
host="http://www.tr.com/"
truc=`echo $host | sed 's/./\./g'|sed 's///\//g' `
echo $truc


Tout vient de l'évaluation réalisé par le <'> (le quote) qui
effectivement semble ne pas réagir de la façon attendue (ou du moins,
pas la façon dont on aurait espéré ou imaginé).

Le mieux est donc d'utiliser "eval" :

#!/bin/bash
host="http://www.tr.com/"
truc=eval echo $host | sed 's/./\./g'|sed 's///\//g'
echo $truc

resultat :
http://www.tr.com/

Je ne sais si c'est le résultat voulu, mais en tout cas, c'est le même
que l'utilisation *interactive* du bash.

resultat 1
========= > http://www.tr.com/

Script 2 (lancé dans le term)
======= > echo "http://www.tr.com/" | sed 's/./\./g'|sed 's///\//g'

resultat 2
========= > http://www.tr.com/

Merci
De rien


JRD.
--

http://jerome.drapeau.free.fr
La critique est aisée, l'art est difficile.

Avatar
Bernard Déléchamp
Bonjour,


Bonsoir,

Quelqu'un pet il m'expliquer pourquoi le résultat de ces 2 petit scripts
sont différents ?

Script 1
======= > #!/bin/bash
host="http://www.tr.com/"
truc=`echo $host | sed 's/./\./g'|sed 's///\//g' `


truc=$(echo $host | sed 's/./\./g'|sed 's///\//g')

echo $truc

resultat 1
========= > http://www.tr.com/


Script 2 (lancé dans le term)
======= > echo "http://www.tr.com/" | sed 's/./\./g'|sed 's///\//g'


resultat 2
========= > http://www.tr.com/


Dans le script 1, si tu remplaces les backquotes par $( et ), les 2
résultats sont identiques.

</début extrait man bash>
La substitution de commandes permet de remplacer le nom d'une commande
par son resultat. Il en existe deux formes :

$(commande)
ou
`commande`

[...]

Quand l'ancienne forme de substitution avec les backquotes ` est
utilisee, le caractere antislash garde sa signification litterale, sauf
s'il est suivi de $, `, ou . La premiere backquote non protegee par
un antislash termine la substitution de commande. Quand on utilise la
forme $(commande), tous les caracteres entre parentheses gardent leurs
valeurs litterales. Aucun n'est traite specialement.
</fin extrait man bash>

Ce comportement est donc apparemment normal et est reproduit à
l'identique avec ksh et zsh.

PS fais-moi passer de l'aspirine, les bardées de «» ne sont pas très
aisées à lire ;-)

Amicalement.

--
Il est très curieux de constater que dans l'armée, les statistiques
le prouvent, la mortalité augmente bizarrement en temps de guerre.
Alphonse Allais

Avatar
TiChou
Dans le message <news:,
*Bernard Déléchamp* tapota sur f.c.o.l.configuration :

Je me permets d'apporter ma contribution,

Quelqu'un pet il m'expliquer pourquoi le résultat de ces 2 petit scripts
sont différents ?



[...]

truc=`echo $host | sed 's/./\./g'|sed 's///\//g' `


truc=$(echo $host | sed 's/./\./g'|sed 's///\//g')

echo $truc
http://www.tr.com/

echo "http://www.tr.com/" | sed 's/./\./g'|sed 's///\//g'
http://www.tr.com/


Dans le script 1, si tu remplaces les backquotes par $( et ), les 2
résultats sont identiques.


[snip l'explication très claire :)]

PS fais-moi passer de l'aspirine, les bardées de «» ne sont pas très
aisées à lire ;-)


On est bien d'accord. :)

Je voulais apporter l'astuce suivante. Si la finalité du script est de
précéder d'un antislash tous les « métacaractères », cela peut être fait
plus simplement en utilisant la fonction quotemeta de Perl :

$ perl -e '$host = "http://www.tr.com/"; print quotemeta $host'
http://www.tr.com/

ou

$ perl -e '$host = "http://www.tr.com/"; print "Q$hostE"'
http://www.tr.com/

--
TiChou