2015-06-26 77 views
0

我有這個runtime需要替換純文本文件中的環境變量。說該文件是這樣的:如何內插表示環境變量的字符串

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

我的bash腳本翻出所有的環境瓦爾,這裏​​。

一旦我掌握了哪些字符串標記是環境變量,我想用運行該腳本的主機中的環境var值替換它們。所以上面,我會替換字符串​​與env值​​。

與我有什麼,我可以列出所有env瓦爾。但我似乎無法完成替換。對於我的玩具例子,我想呼應出了字符串令牌和價值就應更換:

#!/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

定界符本來是一個很好的方法,但不與我所試圖做的嘲弄:

我想呼應出了字符串令牌和價值就應更換

我是在正確的軌道與這:

echo "$element ${$element}" 

最後,這裏是什麼工作:

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

Upvotes for all,無論。

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,它可以與sede一蹴而就。

$ 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才能看到它的值。