Призначте вихідну змінну в Bash


165

Я намагаюся призначити вихід 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, переданий на ехо, не загорнутий у подвійні лапки, він виведе лише останній рядок відзнятого виводу вигину.
Крістофер Хантер

Дякую @ChristopherHunter, я прийшов сюди просто шукаю це. Чому він так поводиться?
Амея

@Amey Я не можу точно сказати, про що міркували, просто так поводиться ехо, коли ви даєте йому багаторядковий рядок як аргумент.
Крістофер Хантер

Відповіді:


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для відключення рядка прогресу та повідомлень про помилки.
Searene

Завжди можна переспрямувати stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen

знаходячи з синтаксисом $ (), я не в змозі використовувати змінні env, наприклад, замість жорсткого кодування електронної пошти, я хочу використовувати $ 2, $ 3 як змінні. Будь-які ідеї, чому ці звичаї надаються?
Еван Бербідж

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

Це саме те, що я робив у своєму баш-скрипті, і ти врятував мене від необхідності встановити apt-get install jq!
Nungster

Як це можна зробити на вікнах? якщо підставити $з os.system, INSTANCE_REGION не має значення виходу.
Хайнц

Як зробити цей багаторядковий?
Халил Гарбауї
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.