Я получаю IP-адреса, разделенные запятыми, в виде строки в своем приложении из terraform. Мне нужно заменить переменную в файле конфигурации массивом ips. Номер ips может быть любым. Я взял 2 в качестве примера.
Скрипт.sh:
#!/bin/bash
var_ips = "10.10.10.177,10.10.10.181"
IFS=','
read -ra ip_array <<< "$var_ips"
form_hosts=()
for item in "${ip_array[@]}";do
form_hosts+=("\"$item\"")
done
sed -i "s/^hosts: \"from_terraform_hosts\"$/hosts: [${form_hosts[*]}]/g" host.conf
хост.конф
hosts: "from_terraform_hosts"
//file truncated
Здесь я хочу запись в host.conf как
hosts: ["10.10.10.177","10.10.10.181"]
но я получаю
hosts: ["10.10.10.177" "10.10.10.181"]
Запятая отсутствует при замене значений. Может ли кто-нибудь помочь решить вышеуказанную проблему. Разница обусловлена тем, что ниже
echo [${form_hosts[*]}]
echo "[${form_hosts[*]}]"
Выход
["10.10.10.177" "10.10.10.181"]
["10.10.10.177", "10.10.10.181"]
Здесь под двойными кавычками идет только запятая, но я не могу использовать этот способ внутри команды sed.
Результат @Biffen остается таким же, когда мы используем его при замене значения в sed. это запятая пропущена.
@LOrD_ARaGOrN Я не знаю, что вы сделали, но sed "s/^hosts: \"from_terraform_hosts\"$/hosts: [\"${var_ips/,/\",\"}\"]/g" host.conf дает мне hosts: ["10.10.10.177","10.10.10.181"] (никаких массивов или чего-то еще; просто установите $var_ips, а затем sed).
@biffen, ты очень близок. это работает, но не работает, если количество IP-адресов меняется на 1, 3 или более. Это должно быть общее
@LOrD_ARaGOrN sed "s/^hosts: \"from_terraform_hosts\"$/hosts: [\"${var_ips//,/\",\"}\"]/g" host.conf работает для любого* номера. Обратите внимание на добавленный /. (*Я пробовал это с 1, 2, 3 и 4.)
Супер Биффен. Спасибо
Почему бы вам вообще не определить его как массив? var_ips=( 10.10.10.177 10.10.10.181 )"
@ user1934428 user1934428 я определил его только для целей тестирования. Однако я получаю его в своем приложении от terraform, который отправляет только в строковом формате.
В этом случае я бы сначала преобразовал строку в массив: IFS=, ips_arr=( $var_ips ).





Вы можете сделать это с помощью расширения параметров Bash, массивы не нужны:
#!/bin/bash
var_ips = "10.10.10.177,10.10.10.181"
sed -i "s/^hosts: \"from_terraform_hosts\"$/hosts: [\"${var_ips//,/\",\"}\"]/g" host.conf
${var_ips//,/\",\"} расширяет $var_ips, но заменяет запятые на ",", а замена sed оборачивает его в [" и "].
Обратите внимание, что это будет работать только до тех пор, пока $var_ips не содержит никаких «забавных вещей», например. пробелы (они окажутся внутри кавычек) или специальные символы регулярных выражений (они нарушат команду sed).
Не могли бы вы просто заменить запятые в
$var_ipsвместо преобразования в массив Bash и обратно, например что-то вродеecho "[\"${var_ips/,/\",\"}\"]"?