199 votes

Assigner la sortie à une variable dans Bash

J'essaie d'assigner la sortie de cURL dans une variable comme ceci :

#!/bin/sh
$IP=`curl automation.whatismyip.com/n09230945.asp`
echo $IP
sed s/IP/$IP/ nsupdate.txt | nsupdate

Cependant, lorsque j'exécute le script, il se produit ce qui suit :

./update.sh: 3: =[my ip address]: not found

Comment puis-je obtenir la sortie dans $IP correctement ?

0 votes

La réponse acceptée est correcte, mais il y a une autre distinction mineure entre cet exemple et celui que nous avons ici : si la variable $IP passée à echo n'est pas entourée de guillemets, elle ne produira que la dernière ligne de la sortie curl capturée.

0 votes

Merci @ChristopherHunter, je suis venu ici justement pour chercher ça. Mais pourquoi se comporte-t-il de la sorte ?

1 votes

@Amey Je ne peux pas dire exactement quel était le raisonnement, juste que c'est la façon dont echo se comporte lorsque vous lui donnez une chaîne de plusieurs lignes comme argument.

358voto

ghoti Points 14996

En shell, on ne met pas de $ devant une variable que l'on assigne. Vous utilisez $IP uniquement lorsque vous faites référence à la variable.

#!/bin/bash

IP=$(curl automation.whatismyip.com/n09230945.asp)

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate

3 votes

Existe-t-il un moyen de supprimer la sortie et la barre de progression de l'application curl ? Ajout de -silent feuilles $IP vide...

4 votes

@Dror, curl envoie sa sortie bruyante à stderr, donc la barre de progression devrait être ignorée dans le cas d'un script comme celui-ci. Néanmoins, --silent ou -s fonctionne très bien. Si vous avez des problèmes, veuillez poser une question .

1 votes

Utilisez curl -s pour désactiver la barre de progression et les messages d'erreur.

38voto

Kostas Demiris Points 56

Même chose pour quelque chose de plus complexe... obtenir la région de l'instance ec2 à partir de l'instance.

INSTANCE_REGION=$(curl -s 'http://169.254.169.254/latest/dynamic/instance-identity/document' | python -c "import sys, json; print json.load(sys.stdin)['region']")

echo $INSTANCE_REGION

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X