Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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.

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"
man bash a écrit :

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...

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).

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 big_smile

Dernière modification par tiramiseb (Le 24/12/2012, à 09:10)

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

Hors ligne