2つの間接層を構築しようとしていますが、この問題の犠牲者であることを教えてください。XYの問題
私が達成したいことの簡単な説明
> test1=\$test2
> test2="string to print"
> echo $test2
string to print
> echo $test1
$test2
これはすべて理解できますが、私は考える実行命令を利用して$test1
出力するものですstring to print
。私の直感反応はこれがうまくいくということです
> echo $(echo $test1)
$test2
無意味な言葉。これが可能かどうか他の人が知っていますか?
私がこれを達成したい理由をもっと詳しく説明してください。
$variables
多くのテキストファイルを生成するために再利用できるテンプレートを含むテキストファイルテンプレートを作成したいと思います。私の考えは、環境変数を設定し、テンプレートファイルを処理し、別のファイルに出力することです。
例:
> #set vars
> cat template.txt | magic_var_expansion_cmd > out1.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out2.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out3.txt
これは明らかにスクリプトでより洗練された方法で使用できますが、ここでは次のようになります。MVP私の心の中に。
答え1
$ test1="hello"
$ test2="test1"
$ echo "${!test2}"
hello
bash
マニュアルから:
パラメータの最初の文字が感嘆符(
!
)であり、パラメータが名前参照ではない場合、変数間接参照レベルが導入されます。 Bash は、残りの引数で構成される変数値を変数名として使用します。次に、その変数を展開し、引数自体の値ではなく、残りの置換にその値を使用します。これを間接拡張といいます。引数がnamerefの場合、完全間接拡張を実行するのではなく、引数が参照する変数の名前に拡張されます。以下に説明する拡張は例外です${!prefix*}
。${!name[@]}
感嘆符は、間接的な関係を紹介するために開く中括弧の直後になければなりません。
質問の2番目の部分では、テンプレートで実際のシェル変数を使用せずに、代わりに簡単に解析可能なプレースホルダを使用しますsed
。
「を含むいくつかの同様の質問があります。ドキュメントのプレースホルダ文字列をファイルの内容に置き換える方法「、」テンプレートからテキストファイルを生成するツール「そして」テキストファイルでプレースホルダのリストを置き換える方法は?「(まだあります)。
答え2
使用評価する
$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print