これは、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シェルでは、eval
here-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など)を正しくエンコードできますが、ksh93
ASCII以外の文字の場合は、iso8859-1文字セットを使用するロケールでのみ正しく機能します。サポートされていませんが機能します。%H
%s
printf
&
&
ksh93
printf
-v
expanded_VAR1=${ printf... ;}
/メソッドを使用すると、printf
テンプレートのリテラル文字をzformat
エスケープできます(次のように)、/ +here-docメソッドを使用すると/ /プレフィックスを付けてエスケープできます。それからAFAIK、脱出口はありません。%
%%
\
\\
printf
e
eval
$
`
\
\
envsubst
$