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?


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

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

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.