Gán đầu ra cho biến trong Bash


164

Tôi đang cố gắng gán đầu ra của cURL thành một biến như vậy:

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

Tuy nhiên, khi tôi chạy tập lệnh, điều sau đây xảy ra:

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

Làm thế nào tôi có thể nhận được đầu ra $IPchính xác?


Câu trả lời được chấp nhận là chính xác, nhưng có một sự khác biệt nhỏ giữa ví dụ đó và những gì ở đây: nếu var $ IP được chuyển sang echo không được gói trong dấu ngoặc kép, nó sẽ chỉ xuất ra dòng cuối cùng của đầu ra curl được chụp.
Christopher Hunter

Cảm ơn @ChristopherHunter, tôi đến đây chỉ để tìm kiếm cái này. Tại sao nó hành xử theo cách này mặc dù?
Amey

@Amey Tôi không thể nói chính xác lý do là gì, chỉ là đây là cách tiếng vang ứng xử khi bạn đưa ra một chuỗi nhiều dòng làm đối số.
Christopher Hunter

Câu trả lời:


287

Trong shell, bạn không đặt $ trước một biến bạn đang gán. Bạn chỉ sử dụng $ IP khi bạn đề cập đến biến.

#!/bin/bash

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

echo "$IP"

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

2
Có cách nào để triệt tiêu thanh đầu ra và tiến trình curlkhông? Thêm -silent$IPtrống ...
Dror

4
@Dror, curlgửi đầu ra nhiễu của nó tới stderr, vì vậy thanh tiến trình nên được bỏ qua trong trường hợp tập lệnh như thế này. Tuy nhiên, --silenthoặc -shoạt động tốt. Nếu bạn gặp khó khăn, xin vui lòng đặt câu hỏi .
ghoti

Sử dụng curl -sđể vô hiệu hóa thanh tiến trình và thông báo lỗi.
Searene

Bạn luôn có thể chuyển hướng stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen

tìm kiếm với cú pháp $ () tôi không thể sử dụng các biến env, ví dụ thay vì mã hóa cứng một email tôi muốn sử dụng $ 2, $ 3 làm biến. Bất kỳ ý tưởng về lý do tại sao những sẽ không kết xuất?
Evan Burbidge

27

Tương tự với một cái gì đó phức tạp hơn ... lấy khu vực cá thể ec2 từ bên trong thể hiện.

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

Đây chính xác là những gì tôi đã làm trong tập lệnh bash của tôi và bạn đã cứu tôi khỏi phải cài đặt apt-get jq!
Nungster

Làm thế nào điều này có thể được thực hiện trên windows? nếu tôi thay thế $bằng os.system, INSTANCE_REGION không có giá trị đầu ra.
Heinz

Làm thế nào để thực hiện đa dòng đó?
Khalil Gharbaoui
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.