กำหนดเอาต์พุตให้กับตัวแปรใน Bash


166

ฉันพยายามกำหนดผลลัพธ์ของ cURL ให้เป็นตัวแปรดังนี้:

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

อย่างไรก็ตามเมื่อฉันรันสคริปต์สิ่งต่อไปนี้จะเกิดขึ้น:

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

ฉันจะเอาท์พุทให้$IPถูกต้องได้อย่างไร?


คำตอบที่ยอมรับนั้นถูกต้อง แต่มีความแตกต่างอีกเล็กน้อยระหว่างตัวอย่างนั้นกับสิ่งที่นี่: ถ้า $ IP var ที่ส่งไปยัง echo ไม่ได้อยู่ในเครื่องหมายคำพูดคู่มันจะส่งออกเฉพาะบรรทัดสุดท้ายของเอาต์พุต curl ที่จับ
Christopher Hunter

ขอบคุณ @ChristopherHunter ฉันมาที่นี่เพื่อค้นหาสิ่งนี้ ทำไมมันถึงมีพฤติกรรมแบบนี้?
Amey

@ ฉันไม่สามารถพูดได้อย่างแน่ชัดว่าเหตุผลคืออะไรนี่คือสิ่งที่เสียงสะท้อนทำงานเมื่อคุณให้สตริงแบบหลายบรรทัดเป็นอาร์กิวเมนต์
Christopher Hunter

คำตอบ:


288

ในเชลล์คุณจะไม่ใส่ $ ไว้ข้างหน้าตัวแปรที่คุณกำหนด คุณใช้ $ IP เท่านั้นเมื่อคุณอ้างถึงตัวแปร

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate

2
มีวิธีระงับแถบแสดงผลและแถบแสดงความคืบหน้าcurlใช่หรือไม่ กำลังเพิ่ม-silentใบ$IPว่าง ...
Dror

4
@Dror curlส่งเอาต์พุตที่มีเสียงดังไปยัง stderr ดังนั้นแถบความคืบหน้าควรถูกละเว้นในกรณีของสคริปต์เช่นนี้ อย่างไรก็ตาม--silentหรือ-sทำงานได้ดี ถ้าคุณมีปัญหาโปรดถามคำถาม
ghoti

ใช้curl -sเพื่อปิดแถบความคืบหน้าและข้อความแสดงข้อผิดพลาด
เซียร์ลีน

คุณสามารถเปลี่ยนเส้นทางได้ตลอดเวลาstderr:IP=$(curl <url> 2>/dev/null)
BallpointBen

การค้นหาด้วยไวยากรณ์ $ () ฉันไม่สามารถใช้ตัวแปร env เช่นแทนที่จะเขียนรหัสอีเมลยากฉันต้องการใช้ $ 2, $ 3 เป็นตัวแปร ความคิดเห็นใด ๆ ที่ว่าทำไมสิ่งเหล่านี้ถึงไม่แสดงผล?
Evan Burbidge

28

เช่นเดียวกันกับสิ่งที่ซับซ้อนกว่า ... รับขอบเขตอินสแตนซ์ ec2 จากภายในอินสแตนซ์

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

นี่คือสิ่งที่ฉันทำในสคริปต์ทุบตีของฉันและคุณช่วยฉันจากการไม่จำเป็นต้องติดตั้ง jq!
Nungster

วิธีนี้สามารถทำได้บน windows? หากฉันแทนที่$ด้วยos.systemINSTANCE_REGION จะไม่มีค่าของเอาต์พุต
ไฮนซ์

วิธีการทำหลายบรรทัดนั้น
Khalil Gharbaoui
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.