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.