cat - ファイルをリダイレクトしますが、変数拡張を含みます。

cat - ファイルをリダイレクトしますが、変数拡張を含みます。

~/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

$domainsedコマンドの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

関連情報