Bashにはいくつかのレベルの間接参照を適用できますか?

Bashにはいくつかのレベルの間接参照を適用できますか?

Bashでは、2つの方法で可変間接拡張を実行できることを知っています。

  • 使用declare:declare -n foo=bar
  • 拡張機能を使用してください${!..}

私たちは2つを組み合わせることができます:

declare -n foo=SHELL
bar=foo
echo ${!bar}

以下を提供します。

/bin/bash

より多くのレベルに拡張できますか?


ほとんどは難読化されたコードを書くことです。私の友人の中には、これをやろうとすることに挑戦しています。

ベストアンサー1

実際、Bashで間接的な方法を実行する別の方法があります。少なくとも動作します。a=1andがある場合は、次のようにthroughの値を取得できますb=aab

eval echo \${$b}

これは複数回ネストできます。

$ a=1; b=a; c=b; d=c
$ eval eval eval echo \\\\\\\${\\\${\${$d}}}
1

各レベルで正しいバックスラッシュ数を見つけるための規則は次のとおりです。

  1. 最も内側のレベルではバックスラッシュは使用されません。
  2. 他のレベルでは2を使用します。N+ 1バックスラッシュ、ここN次の内部レベルで使用されるバックスラッシュの数。

理由:ルール1はマイナーなものです。規則2は、次の内部レベルでバックスラッシュをもう1つ適用する必要があり、現在のレベルで消費されていないすべて、つまり1を除くすべてをエスケープする必要があるという事実に由来します。

したがって、必要なバックスラッシュの数は、レベルの数が増加するにつれて指数関数的に増加するため、このアプローチのネストされた制限にすばやく到達します。

しかし、ここではこれらの制限が非常に学術的であることを強調する必要があります。実際には、保守性などの要件を尊重する必要がある場合は、通常、どの間接メソッドを使用しても、式で2〜3つ以上の間接参照レベルを処理したくありません。

代わりに、ループを使用して次の項目を繰り返すことで、より高いレベルの間接参照を解決できます。

value=${variable}
variable=${!value}

特定のアプリケーションに対して適切に複数回。

おすすめ記事