web-dev-qa-db-ja.com

変数名とその値を印刷するにはどうすればよいですか?

変数名とその値を印刷する方法はありますか?

j=jjj
k=kkk
l=lll

for i in j k l
do
    ....
done

予想される出力(各変数が別の行にある):

j = jjj 
k = kkk
l = lll

上記の結果を得る方法を誰かが提案できますか?

10
ejuser

簡単な方法で:

j="jjj"
k="kkk"
l="lll"

for i in {j,k,l}; do echo "$i = ${!i}"; done

出力:

j = jjj
k = kkk
l = lll

  • ${!i}-bash変数の展開/間接化($iが保持する変数名の値を取得します)
20
RomanPerekhrest

Bash v4.4以降を使用している場合は、${VAR@A}パラメータ展開演算子。

これについては、Bashマニュアルのセクションで説明されています。3.5.3シェルパラメータの拡張

'A'演算子

拡張は、割り当てステートメントまたは宣言コマンドの形式の文字列であり、評価された場合、その属性と値を使用してパラメーターを再作成します。

だからこれであなたはできる:

j="jjj"
k="kkk"
l="lll"

for i in {$j,$k,$l}; do 
    echo "${i@A}"
done

そしてあなたの結果は次のようになります:

j='jjj'
k='kkk'
l='lll'
6
jesse_b

またはzshdeclare -pを使用します

% j=jjj; k=kkk; l=(l l l)               
% for v in j k l; do declare -p $v; done
typeset j=jjj
typeset k=kkk
typeset -a l=( l l l )
% 
5
thrig

${!i}はよりクリーンで高速なソリューションです。完全を期すために、間接参照は次の例でも取得できます。

 foo=bar
 bar=baz
 $ echo $foo
 bar
 $ eval echo \$${foo}
 baz

そのため:

 j="jjj"
 k="kkk"
 l="lll"

 for i in {j,k,l}; do
   echo "$i = `eval echo \\$${i}`"
 done

ギブ:

 j = jjj
 k = kkk
 l = lll

参考文献:

間接参照

2
geedoubleya