Pages : 1
#1 Le 23/12/2012, à 23:49
- infounix59
Utilisation variable avec wget
Bonjour,
j'ai un fichier info_connexion.txt (format unix) qui contient :
Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0|http://www.google.fr
dans mon script principal :
je recupère les deux valeurs du fichier info_connexion.txt dans des variables : pUserAgentet et pUrl
puis je veux me connecter avec wget
#!/bin/sh
cat info_connexion.txt | while read pLigne
do
set -vx
pUserAgent=`echo $pLigne | cut -d"|" -f1`
pUrl=`echo $pLigne | cut -d"|" -f2`
done
wget --user-agent=$pUserAgent -o fichier_resultat.html $pUrl
Le problème c'est que pUserAgent se retrouve avec pleins de guillemets ne sont pas correct dans ma commande wget !?!
Et du coup wget cherche à charger http://(windows et http://NT etc ....
J'ai essayé avec \' , des echo , des commandes entre ` (alt+7)
rien n'y fait ....
Je cherche depuis deux soirées et là çà me dépasse ....
Si vous avez des billes sur le sujet, je suis preneur
D'avance MERCI
Hors ligne
#2 Le 24/12/2012, à 01:08
- Watael
Re : Utilisation variable avec wget
salut,
le pipe s'exécute dans un sous-interpréteur, qui ne communique pas ses variables avec l'environnement appelant (sauf sous certains ksh, ou avec un option de bash).
le fichier ne contient qu'une ligne? alors
IFS='|' read userAgent url <info.txt
wget --user-agent="$userAgent" -o fichier_resultat.html "$url"
-o indique un fichier log
le fichier où sont récupérées les données est indiquer avec -O (o majuscule)
sinon
while ...
do ...
done < fichier
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 24/12/2012, à 08:14
- tiramiseb
Re : Utilisation variable avec wget
Je ne comprend pas l'explication de Watael concernant les pipes.
En tout cas, ce qu'il te manque ce sont des guillemets autour des noms des variables dans ton wget. Pour ça, l'exemple de Watael contient la bonne syntaxe.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#4 Le 24/12/2012, à 08:50
- Watael
Re : Utilisation variable avec wget
Les pipes, les substitutions de commandes, les commandes entre parenthèses sont exécutées dans un sous-interpréteur. Une fois terminé, les variables créées disparaissent, et celles qui ont été modifiées retrouvent leur valeurs d'origines.
$ var=1
$ (var=2; v=12; echo $var $v)
2 12
$ echo "$var ${v:-"\"\$v n'existe pas\""}"
1 "$v n'existe pas"
Les affectations de variables et les commandes internes qui affectent l'environnement de l'interpréteur n'ont pas d'effet une fois que la commande se termine.
voir «ENVIRONNEMENT D'EXÉCUTION DES COMMANDES» dans le man.
il y a une petite astuce,
$ echo "foo" | read var; echo "$var"
$ echo "foo" | { read var ; echo "$var";}
foo
mais sur le long terme, c'est difficile de s'y retrouver avec les accolades.
Mieux vaut utiliser les redirections.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 24/12/2012, à 08:52
- tiramiseb
Re : Utilisation variable avec wget
Oui mais je ne crois pas qu'ici le problème vienne de ça, vu que wget essaie de charger des choses provenant de la ligne en question : wget a bien accès aux variables...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 24/12/2012, à 09:07
- tiramiseb
Re : Utilisation variable avec wget
En résumé, le même script "propre" serait, je pense :
#!/bin/sh
while read pLigne
do
pUserAgent=`echo $pLigne | cut -d"|" -f1`
pUrl=`echo $pLigne | cut -d"|" -f2`
done < info_connexion.txt
wget --user-agent="$pUserAgent" -o fichier_resultat.html "$pUrl"
Mais, comme Watael, je m'interroge sur l'utilité de la boucle : de toute façon tu fais un seul wget, en dehors de la boucle.
S'il n'y a qu'une seule ligne dans le fichier, il est clair que le script en deux lignes que Watael propose est largement mieux.
Il y a également la possibilité suivante :
wget --user-agent="`cut -d'|' -f1 info_connexion.txt`" -o fichier_resultat.html "`cut -d'|' -f2 info_connexion.txt`"
... cela dit j'aime bien la solution de Watael, qui vient moins "immédiatement" à l'esprit mais bien plus agréable à lire (en plus elle n'ouvre le fichier qu'une fois).
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 24/12/2012, à 09:10
- tiramiseb
Re : Utilisation variable avec wget
Après relecture, il me semble qu'il y a par contre une mauvaise utilisation de la commande wget :
Dans la mesure où ton "fichier_resultat" a l'extension "html", je pense que ce que tu voulais c'est obtenir la page téléchargée, auquel cas tu dois utiliser l'argument -O (o majuscule).
Car -o (o minuscule) redirige ce qui aurait été affiché à l'écran et non le contenu de l'URL téléchargé.
EDIT: oups Watael l'avait déjà indiqué. Bon ben c'est écrit deux fois maintenant, au moins ce sera bien clair
Dernière modification par tiramiseb (Le 24/12/2012, à 09:10)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 24/12/2012, à 10:27
- infounix59
Re : Utilisation variable avec wget
Bonjour les gars,
Deux grands MERCI à Watael & tiramiseb
je viens de voir vos réponses et la solution est là.
Il fallait effectivement et tous simplement mettre les variables entre des doubles cotes "" pour utiliser les variables dans la ligne de commandes wget.
J'avais été trompé dès le début par les logs (où les côtes sont mal positionnées mais finalement bien interprétées) :
wget '--user-agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)' -O fichier_resultat.html http://www.infowebmaster.fr/outils/mon-user-agent.php
Le site appelé par la commande m'informe que je suis connu avec le user-agent désiré (dans la commande wget)
CA MARCHE
Encore merci et bonne journée
Hors ligne
#9 Le 24/12/2012, à 12:14
- tiramiseb
Re : Utilisation variable avec wget
où les côtes sont mal positionnées mais finalement bien interprétées
Les guillemets (une côte c'est plutôt un os ou en bord de mer - tu confonds certainement avec le terme anglais "quote" qui signifie "apostrophe") peuvent en fait être placés n'importe où à partir du moment qu'ils "protègent" les caractères spéciaux (espaces, etc).
Pour un shell, les lignes suivantes sont équivalentes :
"--user-agent=toto titi tutu"
--user-agent=toto" titi tutu"
--user-agent="toto titi tutu"
--user-agent=to"to titi tutu"
"--user-agent=toto "titi" tutu"
... etc
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne