Atribuir saída à variável no Bash

164

Eu estou tentando atribuir a saída de cURL em uma variável assim:

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

No entanto, quando executo o script, acontece o seguinte:

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

Como posso obter a saída $IPcorretamente?

Alex Bliskovsky
fonte
A resposta aceita está correta, mas há outra pequena distinção entre esse exemplo e o que está aqui: se o $ IP var passado para o eco não estiver entre aspas duplas, ele emitirá apenas a última linha da saída de curvatura capturada.
Christopher Hunter
Obrigado @ChristopherHunter, vim aqui apenas procurando por isso. Por que se comporta dessa maneira?
Amey
@ Amey Eu não posso dizer exatamente qual era o raciocínio, só que é assim que o eco se comporta quando você fornece uma string de várias linhas como argumento.
Christopher Hunter

Respostas:

287

No shell, você não coloca um $ na frente de uma variável que está atribuindo. Você só usa $ IP quando se refere à variável.

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate
ghoti
fonte
2
Existe uma maneira de suprimir a barra de saída e progresso de curl? Adicionando -silentfolhas $IPvazias ...
Dror
4
@Dror, curlenvia sua saída ruidosa para o stderr, portanto a barra de progresso deve ser ignorada no caso de um script como este. No entanto, --silentou -sfunciona muito bem. Se você tiver problemas, faça uma pergunta .
ghoti
Use curl -spara desativar a barra de progresso e as mensagens de erro.
Searene
Você sempre pode redirecionar stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
encontrando com a sintaxe $ () eu não sou capaz de usar variáveis ​​env, por exemplo, em vez de codificar um e-mail, eu quero usar $ 2, $ 3 como variáveis. Alguma idéia de por que eles não renderizam?
precisa
27

Mesmo com algo mais complexo ... obter a região da instância ec2 de dentro da instância.

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
fonte
Era exatamente isso que eu estava fazendo no meu script bash e você me salvou de ter que apt-get install jq!
Nungster 31/10/19
Como isso pode ser feito no Windows? se eu substituir $por os.system, INSTANCE_REGION não tem o valor da saída.
Heinz
Como fazer essa multi-linha?
Khalil Gharbaoui