変数が参照されるたびに含まれる変数を動的に挿入できるように、文字列に変数を含む文字列変数を取得する方法を知りたいです。
これはサンプルコードで最もよく説明されています。
#!/bin/bash
VAR1="string of var1 $VAR2"
function function1()
{
echo "$1 $VAR1"
}
function function2()
{
VAR2="$1"
}
function2 1000
function1 "example 1:"
function2 2000
function1 "example 2:"
出力は次のとおりです
example 1: string of var1
example 2: string of var1
ただし、希望の出力は次のとおりです。
example 1: string of var1 1000
example 2: string of var1 2000
これに関する問題は、VAR1が実行時に一度だけ評価されるのに対し、望ましい効果は参照されるたびに評価されることです。文字列VAR1補間する機能1、VAR2変数宣言で補間が行われ、空です。
明らかにこれは人為的な例ですが、文字列リテラルの一部として頻繁に変更される変数があると想像するのは難しくありません。
私は脱出を試みた。VAR2\$VAR2
文字列リテラルに二重引用符を使用します。VAR1。どちらもリテラル文字列」を生成します。var1 $VAR2 文字列」
私も試しました。評価する同様eval "echo "$1 $VAR1""
ですが、これはうまくいかず、引用符をエスケープするのが難しくなり始めます。
はい、すべてをリファクタリングして機能させることができることを知っています。これは質問に対する適切な答えではありません。
答え1
@DopeGhotiがコメントで述べたように、変数は動的ではなく、データを生成するコマンドではなく静的データを格納します。実行するたびに異なるデータが生成されるようにするには、関数を使用してから次を参照してください$()
。
dynamic_thing()
{
echo "string of dynamic_thing $VAR2"
}
function function1()
{
echo "$1 $(dynamic_thing)"
}
function function2()
{
VAR2="$1"
}
function2 1000
function1 "example 1:"
function2 2000
function1 "example 2:"
出力は次のとおりです
example 1: string of dynamic_thing 1000
example 2: string of dynamic_thing 2000
答え2
VAR1='string of var1 $VAR2'
function function1()
{
eval echo \"'$1 $VAR1'\"
}