Variable vide [Résolu/Fermé]

Signaler
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
-
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
-
Bonjour,
Je suis confus de demander de l'aide pour ce problème mais je m'arrache les cheveux sur ce qui devrait être simple.
Voilà ce qui m'amène.
Je lis un fichier et extrait cette ligne:
192.168.1.86 MaMaison
J'en extrait l'IP dans une variable:
oldip=$(grep "MaMaison" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}');

Cette variable est vide.
 echo "Ancienne IP:" $oldip

Si je fais la même chose en dehors du script
grep "MaMaison" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

J'ai bien la bonne réponse.
192.168.1.86
Pourquoi ?


3 réponses

Messages postés
18236
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 novembre 2020
5 079
hello
si l'affichage se fait en dehors du script, la variable a disparu avec la fin du script
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
7
Pour le test j'ai demandé en 2e ligne le résultat de cette variable. Je suis bien dans le script... Au vu de ta réponse, il semblerait que je n'ai pas fait de faute. Je vais donc creuser plus encore pour comprendre. Merci.
Messages postés
35768
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 novembre 2020
5 638
Salut,
Si je fais la même chose en dehors du script
grep "MaMaison" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

J'ai bien la bonne réponse.
Et si tu fais la même chose dans le script sans déclarer la variable, juste la commande ?

L'IP s'affiche ?
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
7
J'approche du but. C'est encore ma variable qui est mal lue.
Quand je mets
 oldip=$(grep "MaMaison" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}');

Ça marche.
Si je mets:
 oldip=$(grep "${origine}" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}');

Ça ne marche pas.
Si j'enlève les double cotes, ça ne change rien

Si je fais:
echo "origine" $origine
# récupération de l'ancienne IP.
oldip=$(grep "MaMaison" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}');

echo "origine "$origine
echo "Valeur" $oldip;
exit 0;


origine MaMaison
origine MaMaison
Valeur 192.168.1.86


et si je fais
echo "origine" $origine
# récupération de l'ancienne IP.
oldip=$(grep "${origine}" /etc/hosts | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}');

echo "origine" $origine
echo "Valeur" $oldip;
exit 0;

J'obtiens:
# sh /home/thierry/Documents/scripts/hosts
origine MaMaison
origine MaMaison
Valeur



Chercheur en améliorations.
Messages postés
35768
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 novembre 2020
5 638 >
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019

echo origine $'MaMaison\r'

Voilà le coupable ;-(((

Script fait sous Windows (retour chariot).

Convertit ton script au format Unix (dos2unix) et recommence ;-)
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
7
Je suis sceptique. J'ai pondu ce script sur ce PC qui ne travaille que sous linux depuis sa naissance. C'est dire... Par contre la variable $origine est transmise par internet. Donc elle a peut être été formatée. Utiliserait-on la même commande pour transformer la variable ?
Messages postés
35768
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 novembre 2020
5 638 >
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019

$ B=$(echo -e 'Bonjour\r')

$ echo "${B}" | cat -A
Bonjour^M$

$ echo "${B/$'\r'/}" | cat -A
Bonjour$
Messages postés
35768
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 novembre 2020
5 638 >
Messages postés
35768
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 novembre 2020

Tiens un exemple concret :

Mon fichier hosts :
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 Mint-Qiana

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


Création d'une variable avec un retour chariot (le ^M est obtenu par la combinaison de touche CTRL-V + CTRM-M) :
$ var='Mint^M'


Tentative de récupération de l'adresse de Mint-Qiana :
$ grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}(?=\t${var})" /etc/hosts


La même en supprimant le retour chariot :
$ grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}(?=\t${var/$'\r'/})" /etc/hosts
127.0.1.1
Messages postés
135
Date d'inscription
dimanche 5 juillet 2015
Statut
Membre
Dernière intervention
25 mai 2019
7
J'ai ajouté
test=${origine/$'\r'/} ;
echo "test" $test;

Et ça fonctionne. C'est magnifique....
Je n'aurais jamais trouvé un tel problème sans ton aide.
Merci zipe31