Bash: преобразовать IP-адреса, разделенные запятыми, в массив IP-адресов

Я получаю 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.

Не могли бы вы просто заменить запятые в $var_ips вместо преобразования в массив Bash и обратно, например что-то вроде echo "[\"${var_ips/,/\",\"}\"]"?

Biffen 31.05.2024 11:04

Результат @Biffen остается таким же, когда мы используем его при замене значения в sed. это запятая пропущена.

LOrD_ARaGOrN 31.05.2024 11:08

@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 31.05.2024 11:20

@biffen, ты очень близок. это работает, но не работает, если количество IP-адресов меняется на 1, 3 или более. Это должно быть общее

LOrD_ARaGOrN 31.05.2024 11:28

@LOrD_ARaGOrN sed "s/^hosts: \"from_terraform_hosts\"$/hosts: [\"${var_ips//,/\",\"}\"]/g" host.conf работает для любого* номера. Обратите внимание на добавленный /. (*Я пробовал это с 1, 2, 3 и 4.)

Biffen 31.05.2024 11:30

Супер Биффен. Спасибо

LOrD_ARaGOrN 31.05.2024 11:31

Почему бы вам вообще не определить его как массив? var_ips=( 10.10.10.177 10.10.10.181 )"

user1934428 31.05.2024 14:33

@ user1934428 user1934428 я определил его только для целей тестирования. Однако я получаю его в своем приложении от terraform, который отправляет только в строковом формате.

LOrD_ARaGOrN 03.06.2024 05:12

В этом случае я бы сначала преобразовал строку в массив: IFS=, ips_arr=( $var_ips ).

user1934428 03.06.2024 07:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью расширения параметров 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).

Другие вопросы по теме