Assegna l'output alla variabile in Bash


166

Sto cercando di assegnare l'output di cURL in una variabile in questo modo:

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

Tuttavia, quando eseguo lo script, accade quanto segue:

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

Come posso ottenere $IPcorrettamente l'output ?


La risposta accettata è corretta, ma c'è un'altra distinzione minore tra quell'esempio e ciò che è qui: se $ IP var passato a eco non è racchiuso tra virgolette doppie, produrrà solo l'ultima riga dell'output di arricciatura catturato.
Christopher Hunter,

Grazie @ChristopherHunter, sono venuto qui solo per cercare questo. Perché si comporta così?
Amey,

@Amey Non posso dire esattamente quale fosse il ragionamento, solo che questo è il modo in cui l'eco si comporta quando gli dai una stringa multi-linea come argomento.
Christopher Hunter,

Risposte:


288

Nella shell, non metti un $ davanti a una variabile che stai assegnando. Usi $ IP solo quando ti riferisci alla variabile.

#!/bin/bash

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

echo "$IP"

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

2
C'è un modo per sopprimere l'output e la barra di avanzamento di curl? Aggiunta di -silentfoglie $IPvuote ...
Dror

4
@Dror, curlinvia il suo output rumoroso a stderr, quindi la barra di avanzamento dovrebbe essere ignorata nel caso di uno script come questo. Tuttavia, --silento -sfunziona bene. Se hai problemi, fai una domanda .
Ghoti,

Utilizzare curl -sper disabilitare la barra di avanzamento e i messaggi di errore.
Searene,

Puoi sempre reindirizzare stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen

trovando con la sintassi $ () non sono in grado di usare le variabili env, ad es. invece di scrivere un codice di posta elettronica voglio usare $ 2, $ 3 come variabili. Qualche idea sul perché questi non renderanno?
Evan Burbidge,

28

Lo stesso con qualcosa di più complesso ... ottenere la regione dell'istanza ec2 dall'istanza.

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

Questo era esattamente quello che stavo facendo nel mio script bash e mi hai salvato dal dover apt-get install jq!
Nungster,

Come può essere fatto su Windows? se lo sostituisco $con os.system, INSTANCE_REGION non ha il valore dell'output.
Heinz,

Come rendere quella multi-linea?
Khalil Gharbaoui,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.