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)]ただし、信頼できない場合でも問題が発生する可能性があるため、その値を削除する必要があります。

答え2

これは他の関数に引数を渡すことであり、これが私が見つけた最良の方法です。

local CLIENT_URL="${CLIENT}_URL"
local CLIENT_FOLDER="${CLIENT}_FOLDER"
local CLIENT_BIN_PATH="${CLIENT}_BIN_PATH"
installClient   ${UPDATE_OS_PACKAGES}\
                ${USER_NAME}\
                ${GROUP_NAME}\
                ${!CLIENT_URL}\
                ${!CLIENT_FOLDER}\
                ${!CLIENT_BIN_PATH}

このため、一時的なvarまたはevalを使用したくありません。 (答えるのに2週間かかってすみません。)

答え3

努力する

var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)

関連情報