説明する:
variable="Something that it holds"
それから
echo "$variable"
出力されます: それが含んでいる内容
しかし、私もそうだとしましょう。
var2="variable";
echo "\$$(echo $var2)"
$variable
代わりに:何が含まれているのかを出力します。
ここでUnixのどの機能が機能しているかを教えてくれる人はいますか?
ベストアンサー1
variable="Something" var2="variable"; echo "\$$(echo $var2)"
最後の行では"\$$(echo $var2)"
→→$variable
を期待していますSomething
。これを行うには、シェルがパラメータ拡張を2回実行する必要があります。そうではありませんが、単に$(echo $var2)
接頭辞付きのコマンド置換結果を印刷します$
。
原則として、評価する欲しいものを手に入れるのを手伝ってください。シェルが最初のステップ"\$$(echo $var2)"
→を実行した後、$variable
evalは2番目のステップ$variable
→を実行しますSomething
。
$ eval echo "\$$(echo $var2)"
Something
上記のコマンドは特定のケースでは問題ありませんが、まだ正しい引用符がありません。printf
銃愛を受けるecho
、
$ eval 'printf "%s\n" "${'"$var2"'}"'
Something
ただし、evalは信頼できないデータによってセキュリティ上の問題を引き起こす可能性があります。推定
var2="variable;rm importantFile"
。この場合、評価に合格します。
echo $variable;rm importantFile
シェルにimportantFile
追加すると幸せに削除されます。
一部のシェル(Bash、ksh、Zshなど)では、次のものも使用できます。間接的な。 Bashの間接拡張構文は次のとおりです。
$ echo "${!var2}"
Something
var2="variable;rm importantFile"
もう問題ではありませんが、var2='a[$(rm importantFile)]'
まだ問題です。
間接参照の詳細バッシュマニュアル。
パラメータの最初の文字が感嘆符(!)で、パラメータがnamerefでない場合は、間接参照レベルが導入されます。 Bash は残りの引数を拡張することによって形成された値を新しい引数として使用し、その値は元の引数の拡張ではなく残りの拡張に使用されます。