Przypisz wyjście do zmiennej w Bash

165

Próbuję przypisać dane wyjściowe cURL do zmiennej, takiej jak:

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

Jednak po uruchomieniu skryptu dzieje się co następuje:

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

Jak mogę $IPpoprawnie uzyskać wyjście ?

Alex Bliskovsky
źródło
Zaakceptowana odpowiedź jest poprawna, ale istnieje jeszcze jedno drobne rozróżnienie między tym przykładem a tym, co tutaj: jeśli zmienna $ IP przekazana do echo nie jest ujęta w podwójne cudzysłowy, wyświetli tylko ostatni wiersz przechwyconego wyniku curl.
Christopher Hunter,
Dzięki @ChristopherHunter, przyszedłem tutaj, szukając tego. Dlaczego jednak zachowuje się w ten sposób?
Amey
@Amey Nie mogę powiedzieć dokładnie, jakie było rozumowanie, po prostu tak zachowuje się echo, gdy podajesz mu ciąg wieloliniowy jako argument.
Christopher Hunter

Odpowiedzi:

288

W powłoce nie umieszczasz znaku $ przed przypisywaną zmienną. Używasz $ IP tylko wtedy, gdy odnosisz się do zmiennej.

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate
ghoti
źródło
2
Czy istnieje sposób, aby wyłączyć wyświetlanie i pasek postępu curl? Dodawanie pustych -silentliści $IP...
Dror,
4
@Dror, curlwysyła swoje zaszumione wyjście do standardowego wyjścia błędów, więc pasek postępu powinien być ignorowany w przypadku takiego skryptu. Niemniej jednak --silentlub -sdziała dobrze. Jeśli masz kłopoty, zadaj pytanie .
ghoti
Służy curl -sdo wyłączania paska postępu i komunikatów o błędach.
Searene
Zawsze możesz przekierować stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
znajdując za pomocą składni $ () nie jestem w stanie użyć zmiennych env, np. zamiast sztywnego kodowania wiadomości e-mail, chcę użyć 2 $, 3 $ jako zmiennych. Jakieś pomysły, dlaczego te nie będą renderowane?
Evan Burbidge
28

To samo z czymś bardziej złożonym ... pobieranie regionu instancji ec2 z instancji.

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
źródło
To było dokładnie to, co robiłem w moim skrypcie bash i uratowałeś mnie przed koniecznością wykonania apt-get install jq!
Nungster
Jak można to zrobić w systemie Windows? jeśli podstawię $z os.system, INSTANCE_REGION nie ma wartości danych wyjściowych.
Heinz
Jak zrobić to wieloliniowe?
Khalil Gharbaoui