2012-03-13 11 views
5

Ho un config.ini file con il seguente contenuto:concatenamento variabile stringa all'interno di un ciclo for nella bash shell

@ndbd 

voglio sostituire @ndbd con qualche altro testo per finalizzare il file. Qui di seguito è il mio codice di script bash:

ip_ndbd=(108.166.104.204 108.166.105.47 108.166.56.241) 

ip_temp="" 
for ip in $ip_ndbd 
do 
    ip_temp+="\n\[ndbd\]\nHostname=$ip\n" 
done 
perl -0777 -i -pe "s/\@ndbd/$ip_temp/" /var/lib/mysql-cluster/config.ini 

sostanza, voglio solo per ottenere tutti gli indirizzi IP in un formato specifico, e quindi sostituire @ndbd con la stringa generata.

Tuttavia, il mio ciclo for non sembra concatenare tutti i dati da $ip_ndbd, solo il primo elemento nell'elenco.

Così, invece di ottenere:

[ndbd] 
HostName=108.166.104.204 

[ndbd] 
HostName=108.166.105.47 

[ndbd] 
HostName=108.166.56.241 

sto ottenendo:

[ndbd] 
HostName=108.166.104.204 

Sono abbastanza sicuro che c'è un modo migliore per scrivere questo, ma io non so come.

Apprezzerei un po 'di assistenza.

Grazie in anticipo.

risposta

10

Se si desidera iterare una variabile di matrice , è necessario specificare l'intero array:

ip_ndbd=(108.166.104.204 108.166.105.47 108.166.56.241) 

ip_temp="" 
for ip in ${ip_ndbd[*]} 
do 
    ip_temp+="\n\[ndbd\]\nHostname=$ip\n" 
done 
0

non ho visto qualsiasi utilizzo del file con @ndbd contenuti ...

è questo che vuoi?

kent$ echo "108.166.104.204 108.166.105.47 108.166.56.241"|awk '{for(i=1;i<=NF;i++){print "[ndbd]";print "HostName="$i;print ""}}' 
[ndbd] 
HostName=108.166.104.204 

[ndbd] 
HostName=108.166.105.47 

[ndbd] 
HostName=108.166.56.241 

si può solo reindirizzare l'output al file config.ini dal > config.ini

2

Sostituire

ip_ndbd=(108.166.104.204 108.166.105.47 108.166.56.241) 

con

ip_ndbd="108.166.104.204 108.166.105.47 108.166.56.241" 
+1

la matrice è migliore, devi solo ciclarla nel modo giusto. – caesarsol