2012-03-15 14 views
13

Ho un file diconfig.txt con indirizzi IP come contenuti di questo tipobash script di comandi uso tagliato a variabile e memorizza il risultato in un'altra variabile

10.10.10.1:80 
10.10.10.13:8080 
10.10.10.11:443 
10.10.10.12:80 

voglio ping ogni indirizzo IP in quel file

Sono un principiante, mi dispiace per una domanda del genere ma non ho potuto scoprirlo da solo.

+0

'per line in cat file' verrà eseguito due volte ... una volta con' line = cat' e una volta con 'line = file'. Non penso che sia quello che volevi. – FatalError

risposta

30

La soluzione awk è quello che vorrei utilizzare, ma se vuoi capire i tuoi problemi con bash, ecco una versione riveduta del tuo script.

##config file with ip addresses like 10.10.10.1:80 
#!/bin/bash -vx 
file=config.txt 

while read line ; do 
    ##this line is not correct, should strip :port and store to ip var 
    ip=$(echo "$line" |cut -d\: -f1) 
    ping $ip 
done < ${file} 

Si potrebbe scrivere la vostra linea superiore come

for line in $(cat $file) ; do ... 

Avevi bisogno di sostituzione di comando $(...) per ottenere il valore assegnato a $ ip

righe di lettura da un file di solito è considerato più efficiente con il Modello while read line ... done < ${file}.

Spero che questo aiuti.

+0

+1 non più efficiente, ma più sicuro: 'per la riga in $ (

+0

@yourmother, nota l'uso delle virgolette attorno alle variabili qui: vitale per proteggere gli spazi bianchi nei valori. –

+2

Nota l'ip può essere estratto con 'ip = $ {line %%: *}' senza dover chiamare echo | cut. –

4

È possibile evitare il loop e tagliare ecc utilizzando:

awk -F ':' '{system("ping " $1);}' config.txt 

Tuttavia sarebbe meglio se pubblichi un frammento della vostra config.txt