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.