
考える:
a=b; b=c; c=d
これにより、次のようなeval echo \$$a
出力が生成されます。
c
d
input のみを使用して出力を抽出するには、a
次のことを試しました。
(i)eval echo \$(eval echo \$$a)
エラーが発生します。
syntax error near unexpected token '('
(ii)eval echo \$\(eval echo \$$a\)
成果物の生産:
c
カッティングカッコをエスケープするとエラーが取り除かれる理由を理解できません。
d
また、誰かが2番目のインスタンスから出力を取得できない理由を説明できますか?
答え1
まず、次の点に注意してください。
セキュリティの観点から見ると、それを使用するのは非常に悪いeval
考えです。どのわからない場合はシェルスクリプト正確に何をしてください。 (それでも実際にこれが最善の解決策であることはほとんどありません。)シェルスクリプトの初心者としてeval
Evenが存在することを忘れてください。
詳細については、次を参照してください。評価コマンドとセキュリティの問題。
出力を取得するには、次のものをd
使用できます。
eval echo \$${!a}
または:
eval eval echo \\\$\$$a
間違った部分は、エスケープされていない角かっこ文字をに渡すことですecho
。前に引用符がない文字がある場合は、コマンドの$
置き換えです。しかし、$
引用された場合いいえ角かっこは有効なシェル構文ではありません。
答え2
入れ子になった評価は厄介です。
まず、
eval echo \$\(eval echo \$$a\)
インタプリタに次のことを評価させます。
echo $(eval echo $b)
最も内側に入れ子になったコマンド(たとえば$(eval echo $b)
)を挿入すると、次のような結果が得られます。
echo c
結果は次のとおりです。
c
ネストされた評価を正しく評価するには(強くお勧めします)いいえeval
使用される別の言葉)、あなたはますますおかしくなっているようです。例については、他の回答をご覧ください。