GNU/Linux >> Linux の 問題 >  >> Linux

$ {!foo}そしてZsh?

${!FOO} bashで二重置換を実行します 、つまり、FOOの(文字列)値を取得し、それを変数名として使用します。
zsh この機能はサポートされていません。

これをbashで同じように機能させる方法はありますか? およびzsh

背景:

のような環境変数のリストがあります
PATH MAIL EDITOR

最初に変数名を出力し、その後にそれらの値を出力したい。

これはbashで機能します ただし、zshではありません :

for VAR in LIST
do
        echo $VAR
        echo ${!VAR}
done

evalで「古い方法」がどういうわけか可能になるはずです 、しかし私はそれを機能させることができません:

for VAR in LIST
do
        echo $VAR
        echo `eval $$VAR`
done

${${VAR}}のような任意の深い置換を単純に実行できない理由を理解することはできません。 または${${${VAR}}} 必要に応じて、その説明もいいでしょう。

承認された回答:

bashとzshはどちらも間接拡張を実行する方法がありますが、使用する構文は異なります。

evalを使用して間接拡張を実行するのは簡単です;これは、すべてのPOSIXおよびほとんどのBourneシェルで機能します。値にシェルで特別な意味を持つ文字が含まれている場合は、適切に引用するように注意してください。

eval "value="${$VAR}""
echo "$VAR"
echo "$value"

${${VAR}} シェルが実装する機能ではないため、機能しません。中括弧内のものは、${VAR}を含まない構文規則に準拠している必要があります 。 (zshでは、これはサポートされている構文ですが、何か違うことをします。ネストされた置換は、同じ値に対して連続した変換を実行します; ${${VAR}} $VARと同等です これは、値に対して2回恒等変換を実行するためです。)


Linux
  1. $ _対!$。前のコマンドと出力リダイレクトの最後の引数?

  2. ファイルの内容をエンコードして1行としてエコーしますか?

  3. 変数と整数を使用した基本的な除算?

  1. zshで数値変数をゼロパディングする方法(おそらくbashも?)

  2. stdout と stderr をデフォルト値に戻す

  3. sed e および g フラグが一緒に機能しない

  1. $(stuff)と `stuff`の違いは何ですか?

  2. Sedのスラッシュとバックスラッシュ?

  3. シェルの$*の各要素に文字列を追加して追加しますか?