Asignar salida a variable en Bash

164

Estoy tratando de asignar la salida de cURL en una variable como esta:

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

Sin embargo, cuando ejecuto el script sucede lo siguiente:

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

¿Cómo puedo obtener la salida $IPcorrectamente?

Alex Bliskovsky
fuente
La respuesta aceptada es correcta, pero hay otra distinción menor entre ese ejemplo y lo que está aquí: si la variable $ IP pasada a echo no está entre comillas dobles, solo generará la última línea de la salida de curl capturado.
Christopher Hunter
Gracias @ChristopherHunter, vine aquí solo buscando esto. ¿Por qué se comporta de esta manera?
Amey
@Ay, no puedo decir exactamente cuál fue el razonamiento, solo que así es como se comporta echo cuando le das una cadena de varias líneas como argumento.
Christopher Hunter

Respuestas:

287

En shell, no pones un $ delante de una variable que estás asignando. Solo usa $ IP cuando se refiere a la variable.

#!/bin/bash

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

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate
ghoti
fuente
2
¿Hay alguna forma de suprimir la barra de salida y progreso de curl? Agregando -silenthojas $IPvacías ...
Dror
44
@Dror, curlenvía su salida ruidosa a stderr, por lo que la barra de progreso debe ignorarse en el caso de un script como este. Sin embargo, --silento -sfunciona bien. Si tiene problemas, haga una pregunta .
ghoti
Use curl -spara deshabilitar la barra de progreso y los mensajes de error.
Searene 01 de
Siempre puede redirigir stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen
al encontrar con la sintaxis $ () no puedo usar variables env, por ejemplo, en lugar de codificar un correo electrónico, quiero usar $ 2, $ 3 como variables. ¿Alguna idea de por qué estos no rinden?
Evan Burbidge
27

Lo mismo con algo más complejo ... obtener la región de instancia ec2 desde dentro de la instancia.

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
fuente
¡Esto era exactamente lo que estaba haciendo en mi script bash y me salvó de tener que instalar apt jq!
Nungster
¿Cómo se puede hacer esto en Windows? si sustituyo el $con os.system, INSTANCE_REGION no tiene el valor de la salida.
Heinz
¿Cómo hacer esa línea múltiple?
Khalil Gharbaoui