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?


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.