次の変数を宣言したとします。
$ var='$test'
$ test="my string"
それらの内容を印刷すると、次のようになります。
$ echo $var
$test
$ echo $test
my string
$var
のコンテンツ($test
のコンテンツ)を印刷する方法を見つけたいのですが。だから私は次のことをやろうとしました:
$ echo $(echo $var)
$test
しかし、ここでは結果は$test
であり、"my string"
ではありません... bashを使用して変数の内容の内容を印刷することは可能ですか?
これは、bashの間接変数展開を使用して実現できます(参照変数から$
を省略してもかまいません)。
$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string
var
に含まれる変数名の前に$
が付いている場合は、eval
を使用できます。
$ var='$test'
$ test="my string"
$ eval echo $var
my string
そこで何が起こるの:
$var
を値$test
に展開し、eval echo $test
コマンドを生成します。eval
はecho $test
式を評価し、望ましい結果を生成します。一般にeval
を使用すると危険な場合があるため(var
に何が格納されているかによって)、使用しないことをお勧めします。間接拡張機能の方が適しています(ただし、$
サインイン$test
を取り除く必要があります)。
Jesse_bの回答 に似ていますが、変数の間接参照の代わりに名前参照変数を使用します(bash
4.3+が必要):
$ declare -n var=test
$ test="my string"
$ echo "$var"
my string
名前参照変数var
は、参照している変数の名前を保持します。変数が$var
として逆参照されると、他の変数の値が返されます。
bash
は名前参照を再帰的に解決します:
$ declare -n var1=var2
$ declare -n var2=test
$ test="hello world"
$ echo "$var1"
hello world
完全を期すために、(bash
4.0+で)連想配列を使用することも、要件に応じてこれを解決する1つの方法です。
$ declare -A strings
$ strings[test]="my string"
$ var=test
$ echo "${strings[$var]}"
my string
これにより、動的に決定される可能性のあるキーまたは名前によって複数の値にアクセスするより柔軟な方法が提供されます。これは、特定のカテゴリのすべての値を単一の配列に収集したいが、汚染しないので、いくつかのキー(IDでアクセスできる名前、または目的でアクセスできるパス名など)で引き続きアクセスできる場合に適しています。スクリプトの変数の名前空間。