Объединение строковой переменной внутри цикла for в оболочке bash - PullRequest
5 голосов
/ 14 марта 2012

У меня есть файл config.ini со следующим содержимым:

@ndbd

Я хочу заменить @ndbd другим текстом для завершения файла.Ниже приведен код моего 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

По сути, я просто хочу получить все IP-адреса в определенном формате, а затем заменить @ndbd на сгенерированную подстроку.

ОднакоМой цикл for, кажется, не объединяет все данные из $ip_ndbd, это только первый элемент в списке.

Так что вместо того, чтобы получить:

[ndbd]
HostName=108.166.104.204 

[ndbd]
HostName=108.166.105.47 

[ndbd]
HostName=108.166.56.241

Я получаю:

[ndbd]
HostName=108.166.104.204 

Я почти уверен, что есть лучший способ написать это, но я нене знаю как.

Буду признателен за помощь.

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 14 марта 2012

Если вы хотите перебрать переменную массива, вам нужно указать весь массив:

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
2 голосов
/ 14 марта 2012

Заменить

ip_ndbd=(108.166.104.204 108.166.105.47 108.166.56.241)

с

ip_ndbd="108.166.104.204 108.166.105.47 108.166.56.241"
0 голосов
/ 14 марта 2012

я не видел использования вашего файла с контентом @ndbd ...

это то, что вы хотите?

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

вы можете просто перенаправить вывод в файл config.ini по > config.ini

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...