2015-06-26 4 views
0

У меня есть runtime необходимо заменить переменные среды в текстовом файле. Скажем, файл выглядит следующим образом:Как интерполировать строки, представляющие переменные окружения

version: v1 
kind: Pod 
metadata: 
    - name: $PODNAME 

Мой Баш скрипт вытаскивает все окружение вары, здесь $PODNAME.

Как только у меня есть дескриптор, в котором строковые символы являются переменными окружения, я бы хотел заменить их значением среды var из хоста, на котором запущен скрипт. Поэтому выше, я бы заменил строку $PODNAME значением env$PODNAME.

С тем, что у меня есть, я могу перечислить все env vars. Но я не могу заставить эту замену сделать. Для моего игрушечного примера, я хотел бы повторить из как Строковых и значения, которое должно заменить:

#!/bin/bash 
    IFS=', ' read -a array <<< $(grep -F -- "$" file.yaml | sed -e 's/   value: //' | tr '\n' ' ') 
    for element in "${array[@]}" 
    do 
     echo "$element" 
    done 

Я попытался вещи, как это:

 echo "$element ${$element}" 

Я сделал некоторое но не может найти StackOverflow вопрос, который уже охватывает этот странный usecase.

+1

См. Http://mywiki.wooledge.org/BashFAQ/006 для некоторых методов такого рода вещей. –

ответ

1

Heredoc был бы хороший подход, но не вяжется с тем, что я пытался сделать:

Я хотел бы повторить из как Строковый и значение, которое должно заменить

я был на правильном пути с этим:

echo "$element ${$element}" 

В конце концов, вот что сработало:

EL=$(echo "$element" | sed 's/\$//') 
echo "$element ${!EL}" 

Прививки для всех, независимо.

3

Используйте here document:

PODNAME="foo" 

cat << EOF 
version: v1 
kind: Pod 
metadata: 
    - name: $PODNAME 
EOF 

Выход:

 
version: v1 
kind: Pod 
metadata: 
    - name: foo 
1

Если у вас есть gnu sed, это может быть сделано с e действием sed.

переменная
$ export PODNAME=foo 

$ cat file.yaml 
version: v1 
kind: Pod 
metadata: 
    - name: $PODNAME 

$ sed -r 's/^(.*) (\$[A-Z]+)/echo "\1 \2"/e' file.yaml 
version: v1 
kind: Pod 
metadata: 
    - name: foo 

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