今日は大きな質問があります!私は私の状況を説明するために小さな例を挙げました。
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}}
$FOO
x[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)