varの代わりにネストされたvarを使用する

varの代わりにネストされたvarを使用する

今日は大きな質問があります!私は私の状況を説明するために小さな例を挙げました。

FOO="foo";
fooBAR="final";

var=${${FOO}BAR}
echo $var

「最終」を印刷したい。 ${${!FOO@}BAR}(間違っていることがわかっています)など、さまざまな方法を試しましたが、問題の解決策が見つかりませんでした。理想的には、一時変数/評価を通じて渡したくありません。

ベストアンサー1

それにもかかわらず、いくつかのランタイムコード評価を実行する必要があります。

eval "var=\${${FOO}BAR}"
printf '%s\n' "$var"

または一時的にvar

eval "printf '%s\n' \"\${${FOO}BAR}\""

$FOO変数名以外の項目が含まれる可能性があるという懸念がある場合(たとえば、foo=$(reboot)望ましくない結果が生じる可能性がある)、まず手動でクリーンアップする必要があります。たとえば、次のようになります。

valid_variable() {
  local LC_ALL=C
  case $1 in
    ("" | *[![:alnum:]]* | [0-9]*) return 1
  esac
}

valid_variable "${FOO}BAR" || exit 1
eval "printf '%s\n' \"\${${FOO}BAR}\""

これにより、zsh次のことができます。

printf '%s\n' ${(P):-${FOO}BAR}}

$FOOx[0$(reboot)]ただし、信頼できない場合でも問題が発生する可能性があるため、その値を削除する必要があります。

おすすめ記事