Io-Redirection
cat-redirect 一個文件,但有變數擴展
我有
~/nginx_app
包含此 conf 模板的文件:server { root /var/www/html/${domain}/; server_name ${domain} www.${domain}; }
我也有這個腳本:
#!/bin/bash domain="$1" && test -z ${domain} && return cat ~/myAddons/nginx_app > /etc/sites-available/${domain}.conf
如您所見,我希望將腳本基於模板創建的內容重定向
nginx_app
到 into 。${domain}.conf
現在,當
cat
重定向發生時,需要擴展模板內的變數。你如何保證擴張確實發生了?我在想here-string,但我知道它會列印一個字元串:
cat > "etc/nginx/sites-available/${domain}.conf" <<< "source ~/myAddons/nginx_app"
還有這個
cat ~/myAddons/nginx_app > etc/nginx/sites-available/${domain}.conf
更新
執行腳本後,結束狀態應該
/etc/sites-available/example.com.conf
:server { root /var/www/html/example.com/; server_name example.com www.example.com; }
您想要做的基本上是字元串替換來處理輸入文件的內容,而不是變數擴展(儘管當您引用變數時,shell 會執行此操作,但這不是輸入內容的工作)。
這可以通過 來完成
sed
,並且可以使用 shell 變數,儘管請參閱此答案以了解可能的問題。#!/bin/sh test -n "$1" || exit 1 sed 's/\${domain}/'"$1"'/g' input.txt > output_"$1".txt
input
並相應地進行調整output
。另請注意,我$1
直接使用位置參數,而不是將其複製到變數中。如果我可以建議更好的方法是擁有一個充當模板的腳本,並且您只提供變數作為腳本命令行的位置參數,或者通過採購變數文件。複製文件並通過替換字元串執行雜技,尤其是在模式變得複雜的情況下,並不是最好的方法。