以前に宣言された変数の変数を置き換える

以前に宣言された変数の変数を置き換える

これは、VAR2に従って更新する必要があるテンプレート変数VAR1です。変数の順序は次のとおりです。 sedコマンドなしでVAR1を更新する方法は?

#!/bin/bash
VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test
echo $VAR2

ベストアンサー1

あなたが使用できるenvsubst

(付属のPOSIXシェルを使用してくださいbash):

VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=$(
  export VAR2
  printf '%s\n' "$VAR1" |
    envsubst '$VAR2'
)

または、すべての単語拡張(パラメータ拡張、コマンド置換、算術拡張)を実行します。~上zshパラメータ拡張の場合は、対応するeパラメータ拡張フラグを使用できます。

#!/bin/zsh -
VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=${(e)VAR1}

POSIXシェルでは、evalhere-documentを使用して同様の操作を実行できます。

VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=$(eval "cat << EOF
$VAR1
EOF")

bashまたはのもう1つのオプションは、次のものを使用することzshですprintf

VAR1='<tr>
    <th>%s</th>
  </tr>'
VAR2=test

printf -v expanded_VAR1 -- "$VAR1" "$VAR2"

zsh(使用しない)を使用すると、次の構文を使用してthパラメータを参照bashできます%n$s(多くの実装と同様)。printf(3)n

#! /bin/zsh -
VAR1='<tr>
    <th>%1$s</th> <th>%1$s again</th> <th>%2$s</th>
  </tr>'
VAR2=test VAR3=test2

printf -v expanded_VAR1 -- "$VAR1" "$VAR2" "$VAR3"

または、名前付き形式ディレクティブを使用します(zformat、、NUL、および10進数を除く単一バイト文字に制限されています)。-.

#! /bin/zsh -
VAR1='<tr>
    <th>%a</th> <th>%a again</th> <th>%b</th>
  </tr>'
VAR2=test VAR3=test2

zformat -f expanded_VAR1 "$VAR1" "a:$VAR2" "b:$VAR3"

を使用すると、代わりにを使用してHTMLの特殊文字(beなど)を正しくエンコードできますが、ksh93ASCII以外の文字の場合は、iso8859-1文字セットを使用するロケールでのみ正しく機能します。サポートされていませんが機能します。%H%sprintf&&amp;ksh93printf-vexpanded_VAR1=${ printf... ;}

/メソッドを使用すると、printfテンプレートのリテラル文字をzformatエスケープできます(次のように)、/ +here-docメソッドを使用すると/ /プレフィックスを付けてエスケープできます。それからAFAIK、脱出口はありません。%%%\\\printfeeval$`\\envsubst$

おすすめ記事