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

Спасибо @ChristopherHunter, я пришел сюда только для того, чтобы найти это. Почему это ведет себя так?
Эми

@ Эй, я не могу точно сказать, в чем причина, только то, как эхо ведет себя, когда вы задаете ему многострочную строку в качестве аргумента.
Кристофер Хантер

Ответы:


288

В shell вы не ставите $ перед назначаемой переменной. Вы используете только $ IP, когда обращаетесь к переменной.

#!/bin/bash

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

echo "$IP"

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

2
Есть ли способ подавить вывод и индикатор выполнения curl? Добавление -silentлистьев $IPпустыми ...
Дрор

4
@Dror, curlотправляет свой шумный вывод в stderr, поэтому в случае такого скрипта индикатор выполнения должен игнорироваться. Тем не менее, --silentили -sработает просто отлично. Если у вас есть проблемы, пожалуйста, задайте вопрос .
Готи

Используйте 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

Это было именно то, что я делал в моем скрипте bash, и вы избавили меня от необходимости apt-get install jq!
Nungster

Как это можно сделать на Windows? если подставить $с os.system, INSTANCE_REGION не имеет значения выхода.
Хайнц

Как сделать эту многострочную?
Халил Гарбауи
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.