Weisen Sie der Variablen in Bash eine Ausgabe zu

164

Ich versuche, die Ausgabe von cURL einer Variablen wie folgt zuzuweisen:

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

Wenn ich das Skript ausführe, geschieht jedoch Folgendes:

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

Wie kann ich die Ausgabe $IPrichtig machen?

Alex Bliskovsky
quelle
Die akzeptierte Antwort ist korrekt, aber es gibt noch einen weiteren kleinen Unterschied zwischen diesem Beispiel und dem, was hier ist: Wenn die an echo übergebene $ IP-Variable nicht in doppelte Anführungszeichen gesetzt wird, wird nur die letzte Zeile der erfassten Curl-Ausgabe ausgegeben.
Christopher Hunter
Danke @ChristopherHunter, ich bin hierher gekommen, nur um das zu suchen. Warum verhält es sich so?
Amey
@Amey Ich kann nicht genau sagen, was die Argumentation war, nur dass sich Echo so verhält, wenn Sie ihm eine mehrzeilige Zeichenfolge als Argument geben.
Christopher Hunter

Antworten:

287

In der Shell setzen Sie kein $ vor eine Variable, die Sie zuweisen. Sie verwenden $ IP nur, wenn Sie sich auf die Variable beziehen.

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate
Ghoti
quelle
2
Gibt es eine Möglichkeit, die Ausgabe- und Fortschrittsanzeige von zu unterdrücken curl? Hinzufügen -silentBlätter $IPleer ...
Dror
4
@Dror curlsendet seine verrauschte Ausgabe an stderr, daher sollte der Fortschrittsbalken bei einem solchen Skript ignoriert werden. Trotzdem --silentoder -sfunktioniert gut. Wenn Sie Probleme haben, stellen Sie bitte eine Frage .
Ghoti
Verwenden Sie curl -sdiese Option, um den Fortschrittsbalken und die Fehlermeldungen zu deaktivieren.
Searene
Sie können jederzeit umleiten stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
Mit der Syntax $ () kann ich keine env-Variablen verwenden, z. B. anstatt eine E-Mail hart zu codieren, möchte ich $ 2, $ 3 als Variablen verwenden. Irgendwelche Ideen, warum diese nicht rendern?
Evan Burbidge
27

Gleiches gilt für etwas Komplexeres ... das Abrufen der ec2-Instanzregion aus der Instanz heraus.

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
quelle
Dies war genau das, was ich in meinem Bash-Skript getan habe, und Sie haben mir erspart, jq installieren zu müssen!
Nungster
Wie geht das unter Windows? Wenn ich das $durch os.systemersetze, hat INSTANCE_REGION nicht den Wert der Ausgabe.
Heinz
Wie macht man das mehrzeilig?
Khalil Gharbaoui