亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Bash模板:如何使用Bash從模板構建配置文件?

Bash模板:如何使用Bash從模板構建配置文件?

一只名叫tom的貓 2019-11-23 11:15:40
我正在編寫一個腳本,為自己的Web服務器自動為Apache和PHP創建配置文件。我不想使用任何CPanel或ISPConfig之類的GUI。我有一些Apache和PHP配置文件的模板。Bash腳本需要讀取模板,進行變量替換并將已解析的模板輸出到某個文件夾中。最好的方法是什么?我可以想到幾種方式。哪一個最好,或者可能有更好的方法呢?我想在純Bash中做到這一點(例如,在PHP中很簡單)1)如何在文本文件中替換$ {}占位符?template.txt:the number is ${i}the word is ${word}script.sh:#!/bin/sh#set variablesi=1word="dog"#read in template one line at the time, and replace variables#(more natural (and efficient) way, thanks to Jonathan Leffler)while read linedo    eval echo "$line"done < "./template.txt"順便說一句,我如何在這里將輸出重定向到外部文件?如果變量包含引號,我是否需要轉義?2)使用cat&sed用其值替換每個變量:給定template.txt:The number is ${i}The word is ${word}命令:cat template.txt | sed -e "s/\${i}/1/" | sed -e "s/\${word}/dog/"這對我來說似乎很糟糕,因為需要轉義許多不同的符號,并且帶有許多變量,所以該行太長了。您能想到其他一些優雅安全的解決方案嗎?
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

您可以使用此:


perl -p -i -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < template.txt

${...}用相應的環境變量替換所有字符串(運行此腳本之前不要忘記導出它們)。


對于純bash,這應該可以工作(假設變量不包含$ {...}字符串):


#!/bin/bash

while read -r line ; do

    while [[ "$line" =~ (\$\{[a-zA-Z_][a-zA-Z_0-9]*\}) ]] ; do

        LHS=${BASH_REMATCH[1]}

        RHS="$(eval echo "\"$LHS\"")"

        line=${line//$LHS/$RHS}

    done

    echo "$line"

done

。如果RHS引用一些引用自身的變量,則該解決方案不會掛起:


#!/ bin / bash

line =“ $(cat; echo -na)”

end_offset = $ {#line}

而[[“ $ {line:0:$ end_offset}” =?(。*)(\ $ \ {([a-zA-Z _] [a-zA-Z_0-9] *)\})(。* )]];做

    PRE =“ $ {BASH_REMATCH [1]}”

    POST =“ $ {BASH_REMATCH [4]} $ {line:$ end_offset:$ {#line}}”

    VARNAME =“ $ {BASH_REMATCH [3]}”

    eval'VARVAL =“ $'$ VARNAME'”'

    line =“ $ PRE $ VARVAL $ POST”

    end_offset = $ {#PRE}

完成

echo -n“ $ {line:0:-1}”

警告:我不知道一種正確處理bash中NUL的輸入或保留尾隨換行符數量的方法。出現最后一個變體是因為殼“喜歡”二進制輸入:


read 將解釋反斜杠。

read -r 不會解釋反斜杠,但如果不以換行符結尾,仍會刪除最后一行。

"$(…)"因為有本將去除盡可能多的尾隨換行符,所以我最終…與; echo -n a和使用echo -n "${line:0:-1}":此下降的最后一個字符(這是a)和蜜餞盡可能多的尾隨換行符有一個在輸入(包括無)。


查看完整回答
反對 回復 2019-11-23
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

嘗試 envsubst


FOO=foo

BAR=bar

export FOO BAR


envsubst <<EOF

FOO is $FOO

BAR is $BAR

EOF


查看完整回答
反對 回復 2019-11-23
  • 3 回答
  • 0 關注
  • 786 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號