LINUX.ORG.RU

подстановка значения переменной из Enviroment

 ,


0

1

Всем доброго времени суток. У меня есть скрипт и 2 файла. В одном из файлов перечислены переменные которые добавляются в enviroment. Второй файл содержит шаблон конфигурационного файла и в нём есть строки типа «server $SERVER_IP $SERVER_PORT». На выходе хочу получить 3 файл в котором переменные $SERVER_IP получают значение из enviroment. Но я не могу догнать как это сделать, понимаю что можно написать:

echo "server $SERVER_IP $SERVER_RORT" >> output_file.conf

но это надо каждую строку отдельно расписывать, а их там много. И потом через пол года в этом скрипте чёрт ногу сломит, хочется как-то за один раз, прочитав файл, поставить нужные значения.

Кто-нибудь желал такого? =)

опишу на коде это проще, наверное

env.conf
#!/usr/bin/env bash
export SERVER_IP="1.2.3.4"
export SERVER_PORT="12345"

tmp.conf
server $SERVER_IP $SERVER_PORT

script.sh
#!/usr/bin/env bash
source ./env.conf
IFS="/n"
for i in $(cat ./tmp.conf); do
    echo $i
done

и вот на выходе хочется увидеть: «server 1.2.3.4 12345», но не вижу =) и не понимаю как это сделать.



Последнее исправление: SmilePlz (всего исправлений: 3)

ты можешь сделать по-другому. Использовать директиву ‘source’ или ‘.’.

inc.sh

var1=1
var2=2
var3=5

main.sh

#!/bin/bash

source inc.sh

echo $(($var1+$var2))
echo $(($var3 - $var2))

или main.sh

#!/bin/bash

. inc.sh

echo $(($var1+$var2))
echo $(($var3 - $var2))
kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

да первый файл содержит список значений, который я потом подключаю в скрипте. Но не совсем понимаю есть ли возможность прочитав второй файл, где содержится шаблон конфигурационного файла, взять из него кусок и записать в третий, и при этом значения взять из окружения =) и за один раз ))))

SmilePlz
() автор топика
Ответ на: комментарий от kostik87

я пробовал типа:

for i in $(cat /path_to_file/pattern.conf); do
    eval echo "$line" >> output.conf
done

но что-то не работает. Я не до конца понимаю как работает eval.

SmilePlz
() автор топика
Последнее исправление: SmilePlz (всего исправлений: 4)
Ответ на: комментарий от SmilePlz

но что-то не работает.

Ну так у вас в цикле 'i', а в eval - 'line'.

Я не до конца понимаю как работает eval.

Берем строчное выражения, потому там может быть результат в зависимости от выполнения и полученные строки выполняем как команды.

vodz ★★★★★
()

Не сильно вникал в то, что ты пытаешься сделать, так что сори, если мимо. Но, если ты пытаешься сформировать имена переменных окружения и динамически их прочитать, попробуй конструкцию ${!VARNAME} (indirect expansion)

#!/usr/bin/env bash

VAR=USERNAME
echo "${!VAR}"
# выведет имя пользователя из переменной USERNAME
grazor ★★
()
Ответ на: комментарий от grazor

я читаю из текстового файла, построчно но он мне выдаёт

server ${!SERVER_IP} ${!SERVER_PORT}

в первом посте написал код чтобы проще было понять.

SmilePlz
() автор топика
Последнее исправление: SmilePlz (всего исправлений: 1)

Если правильно понял, что нужно, то можно сделать через while read и утилиту envsubst

источник данных addr_source

1.2.3.4 1234
2.3.4.5 2345
3.4.5.6 3456

шаблон template

# start template
server ${address} ${port}
# end template

скрипт

#!/bin/bash

while read address port
do
    # для примера вывод в консоль
    echo server $address $port
    # подстановка переменных в шаблон с выводом в файл
    address=${address} port=${port} envsubst <template >out_${address}_${port}
done < addr_source

CaHbl4
()
Последнее исправление: CaHbl4 (всего исправлений: 1)
Ответ на: комментарий от CaHbl4

то и вообще только envsubst достаточно

Далась вам эта envsubst, совершенно простейшая и потому неудобная утилита, так вы получите на выходе те самые «# start template» и вдруг оказывается, что надо программировать всё равно и envsubst тогда будет совершенно не нужно.

vodz ★★★★★
()
Ответ на: комментарий от SmilePlz

debug=«${debug:-no}» кажется вот такая конструкция, если нет переменной окружения debug, то присваивает значение no

irton ★★★★★
()
Ответ на: комментарий от irton

в баше работает, но когда читаешь из текстового файла, это не работает. Баш по другому относится к текстовым данным из файлов.

SmilePlz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.