Tetapkan output ke variabel dalam Bash

166

Saya mencoba untuk menetapkan output cURL ke dalam variabel seperti:

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

Namun, ketika saya menjalankan skrip, hal berikut terjadi:

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

Bagaimana saya bisa mendapatkan output $IPdengan benar?

Alex Bliskovsky
sumber
Jawaban yang diterima benar, tetapi ada perbedaan kecil antara contoh itu dan apa yang ada di sini: jika $ IP var yang diteruskan ke gema tidak dibungkus dengan tanda kutip ganda, itu hanya akan menampilkan baris terakhir dari output curl yang ditangkap.
Christopher Hunter
Terima kasih @ChristopherHunter, saya datang ke sini hanya untuk mencari ini. Mengapa itu berlaku seperti ini?
Amey
@ Ya ampun, saya tidak bisa mengatakan dengan tepat apa alasannya, hanya saja begitulah gema berperilaku ketika Anda memberinya string multi-baris sebagai argumen.
Christopher Hunter

Jawaban:

288

Dalam shell, Anda tidak menaruh $ di depan variabel yang Anda tetapkan. Anda hanya menggunakan $ IP saat Anda merujuk ke variabel.

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate
ghoti
sumber
2
Apakah ada cara untuk menekan bar output dan progress curl? Menambahkan -silentdedaunan $IPkosong ...
Dror
4
@ Teror, curlmengirimkan output berisik ke stderr, sehingga bilah kemajuan harus diabaikan dalam kasus skrip seperti ini. Namun demikian, --silentatau -sberfungsi dengan baik. Jika Anda memiliki masalah, silakan ajukan pertanyaan .
ghoti
Gunakan curl -suntuk menonaktifkan bilah kemajuan dan pesan kesalahan.
Searene
Anda selalu dapat mengarahkan stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
menemukan dengan sintaks $ () saya tidak dapat menggunakan variabel env misalnya alih-alih mengkodekan email saya ingin menggunakan $ 2, $ 3 sebagai variabel. Ada ide tentang mengapa ini tidak akan memberikan?
Evan Burbidge
28

Sama dengan sesuatu yang lebih kompleks ... mendapatkan wilayah instance EC2 dari dalam 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
sumber
Ini persis apa yang saya lakukan di skrip bash saya dan Anda menyelamatkan saya dari keharusan apt-get install jq!
Nungster
Bagaimana ini bisa dilakukan di windows? jika saya mengganti $dengan os.system, INSTANCE_REGION tidak memiliki nilai output.
Heinz
Bagaimana cara membuat multi-line?
Khalil Gharbaoui