~/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
。${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;
}
答え1
あなたが望むのは、基本的には変数拡張ではなく入力ファイルの内容を処理する文字列置換です(シェルは変数を引用するときはそうしますが、入力内容には機能しません)。
これはsed
シェル変数を使用して行うことができます。これ発生する可能性のあるすべての質問に答えてください。
#!/bin/sh
test -n "$1" || exit 1
sed 's/\${domain}/'"$1"'/g' input.txt > output_"$1".txt
input
それに応じて調整してくださいoutput
。また、$1
位置パラメータを変数にコピーする代わりに直接使用していることに注意してください。
私が提案できるより良いアプローチは、テンプレートとして機能するスクリプトを持ち、スクリプトコマンドラインから位置引数として変数を提供するか、変数ファイルをインポートすることです。特にパターンが複雑になった場合、ファイルをコピーして文字列を置き換えて曲芸を実行するのは最善の方法ではありません。
答え2
私がしたことは(StephenHarrisのコメントで編集されました):
domain=aa ; sed s"/\$domain/$domain/" ~/nginx_app >> ${domain}.conf
$domain
sedコマンドの2番目の拡張はaa
私のテストケースに適用されます。ただし、最初の識別子$domain
は$
エスケープされているため拡張されません。
awk
変数を外部から内部に渡すより強力な方法がありますが、より高速で効率的であると考えられる別のコマンドラインプログラムがありますsed
(今は実際にはそうはわかりません)。だから私は理由だと答えましたsed
。簡単なケースです。では、awk
以下を使用できます。
awk -v domain=aa '{gsub("\\$domain",domain);print}' ~/nginx_app >> ${domain}.conf
ここで-v
オプションは変数をawk
定義しawk
、与えられた行でグローバル置換を実行する関数gsub
です。awk
エスケープシーケンスはソリューション\\
よりわずかに長いです。sed