2013-07-16 17 views
8

Ho creato uno script interessante che produrrà l'output di cui ho bisogno, ma viene visualizzato solo sullo schermo, quindi devo copiare, quindi incollare i comandi per farli eseguire. Ecco la versione abbreviata del mio script:Posso usare ECHO per eseguire i comandi?

#!/bin/bash 
runc=/etc/csf/csf.pl -d 
for IP in `tail -400 iptext.txt` 
do 
cc=`geoiplookup $IP` 
echo -e $runc $IP $cc | grep Algeria 
echo -e $runc $IP $cc | grep Argentina 
echo -e $runc $IP $cc | grep Armenia 
echo -e $runc $IP $cc | grep Azerbaijan 
echo -e $runc $IP $cc | grep Bolivia 
echo -e $runc $IP $cc | grep Brazil 
done 

Va bene, quindi scorre l'elenco di indirizzi IP in iptext.txt, poi fa una ricerca su GeoIP ognuno, se (in questo esempio) ci sono due partite geoip nella lista, diciamo per l'Armenia e il Brasile, vedrò di uscita come questo per la finestra di shell:

/etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia 
/etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil 

questo è grande, ma voglio di più di una semplice uscita, io in realtà voglio il comando /etc/csf/csf.pl -d da eseguire, e blocca (solo e solo) l'IP nelle righe che corrispondono al nome del paese, nella lista.

Ho provato varie cose con la mia conoscenza limitata dello script di shell, ma finora, niente sembra funzionare. Quindi c'è qualche opzione per ECHO mi manca che in realtà eseguirà il comando piuttosto che semplicemente stampando la linea?

+0

devo rollback vostro inserimento di una risposta nella domanda stessa. Si prega di inviare la propria risposta o approvare uno di quelli esistenti. Nota che la tua soluzione era quasi identica alla risposta di Flo Doe. –

risposta

8

Un modo semplice che non richiede la modifica del proprio script è quello di reindirizzare l'output del comando a un'altra istanza di bash. Come questo:

yourscript | bash - 

Il - dice bash che si deve leggere i comandi da stdin.


Tuttavia, se non si è alla ricerca di una soluzione rapida, è possibile costruire ed eseguire il comando in modo dinamico pure. Come questo:

cmd="ls" 
if [ "foo" != "bar" ] ; then 
    cmd="$cmd -a" 
then 

# ... and so on 

# now execute it: 
$cmd 
+1

Puoi anche reindirizzare il ciclo 'for' in' bash': 'per x in ...; fare ...; fatto | bash -' –

+0

@glennjackman Non ero sicuro e troppo pigro per testare;) ... il piping dell'output del loop suona come la soluzione migliore per me. grazie – hek2mgl

7

È possibile utilizzare eval per eseguire una stringa:

eval $cmdstring 
0

Usa grep -E e un motivo invece:

$runc $IP $cc | grep -E 'Algeria|Argentina|...' 

Spiegazione: echo stamperà il comando, ma non eseguito esso. Basta ometterlo per eseguire effettivamente il comando.

E invece di eseguire lo script 5 volte, utilizzare grep per cercare uno dei cinque motivi contemporaneamente.

E si dovrebbe usare

cc=$(geoiplookup $IP) 

invece di apici inversi; è più sicuro

5

C'è una valutazione incorporata di bash, esegue comandi come se fossero stati digitati nella shell. Ad esempio all'interno del tuo script è possibile effettuare le seguenti operazioni:

eval $(echo -e $runc $IP $cc | grep Algeria) 

Questa elaborerà il vostro eco in una subshell e l'uscita verrà eseguito come è stata digitata nella shell seguito da invio.

Vedere sotto exerpt da manuale bash:

eval [arg ...] Gli argomenti vengono letti e concatenati insieme in un unico comando. Questo comando viene quindi letto ed eseguito dalla shell e il suo stato di uscita viene restituito come il valore di eval. Se non ci sono argomenti o solo argomenti nulli, eval restituisce 0.

0
echo `pwd` 

sopra comando funziona per me.

1

Basta mettere il comando nel paranthesis come questo:

echo $(ls)