Attribuer la sortie à la variable dans Bash

166

J'essaye 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, les événements suivants se produisent:

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

Comment puis-je obtenir la sortie $IPcorrectement?

Alex Bliskovsky
la source
La réponse acceptée est correcte, mais il y a une autre distinction mineure entre cet exemple et ce qui est ici: si la variable $ IP passée à echo n'est pas entourée de guillemets doubles, elle affichera uniquement la dernière ligne de la sortie curl capturée.
Christopher Hunter
Merci @ChristopherHunter, je suis venu ici juste à la recherche de ça. Pourquoi se comporte-t-il de cette façon?
Amey
@Amey Je ne peux pas dire exactement quel était le raisonnement, juste que c'est ainsi que se comporte l'écho lorsque vous lui donnez une chaîne multiligne comme argument.
Christopher Hunter

Réponses:

288

Dans le shell, vous ne mettez pas un $ devant une variable que vous assignez. Vous n'utilisez $ IP que 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
Ghoti
la source
2
Existe-t-il un moyen de supprimer la sortie et la barre de progression de curl? Ajout de -silentfeuilles $IPvides ...
Dror
4
@Dror, curlenvoie sa sortie bruyante à stderr, donc la barre de progression doit être ignorée dans le cas d'un script comme celui-ci. Néanmoins, --silentou -sfonctionne très bien. Si vous rencontrez des problèmes, posez une question .
ghoti le
Utilisez curl -spour désactiver la barre de progression et les messages d'erreur.
Searene
Vous pouvez toujours rediriger stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
trouver avec la syntaxe $ () je ne suis pas capable d'utiliser des variables env, par exemple au lieu de coder en dur un e-mail, je veux utiliser $ 2, $ 3 comme variables. Des idées sur pourquoi ceux-ci ne seront pas rendus?
Evan Burbidge
28

Idem avec quelque chose de plus complexe ... obtenir la région d'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
Kostas Demiris
la source
C'était exactement ce que je faisais dans mon script bash et vous m'avez évité d'avoir à installer apt-get jq!
Nungster
Comment cela peut-il être fait sur Windows? si je remplace le $par os.system, INSTANCE_REGION n'a pas la valeur de la sortie.
Heinz
Comment faire cette multi-ligne?
Khalil Gharbaoui