2012-03-13 21 views
5

Mam config.ini pliku z następujących treści:Konkatenowanie zmienna ciąg wewnątrz pętli for w powłoki bash

@ndbd 

chcę zastąpić @ndbd z jakiegoś innego tekstu do sfinalizowania plik. Poniżej jest mój skrypt bash Kod:

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 

Zasadniczo, po prostu chcę, aby wszystkie adresy IP w określonym formacie, a następnie zastąpić @ndbd z wygenerowanym podciągu.

Jednak moja pętla for nie wydaje się łączyć wszystkich danych z $ip_ndbd, tylko pierwszego elementu na liście.

Więc zamiast się:

[ndbd] 
HostName=108.166.104.204 

[ndbd] 
HostName=108.166.105.47 

[ndbd] 
HostName=108.166.56.241 

Dostaję:

[ndbd] 
HostName=108.166.104.204 

Jestem całkiem pewien, że istnieje lepszy sposób to napisać, ale nie wiem jak.

Byłbym wdzięczny za pomoc.

Z góry dziękuję.

Odpowiedz

10

Jeśli chcesz iteracyjne nad zmienną tablicową , musisz określić całą tablicę:

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

nie widzę żadnego wykorzystanie pliku z treścią @ndbd ...

jest to czego chcesz?

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 

może po prostu przekierować dane wyjściowe do pliku config.ini przez > config.ini

2

Wymień

ip_ndbd=(108.166.104.204 108.166.105.47 108.166.56.241) 

z

ip_ndbd="108.166.104.204 108.166.105.47 108.166.56.241" 
+1

Szereg jest lepszy, wystarczy je przełączyć w odpowiedni sposób. – caesarsol

Powiązane problemy