変数名とその値を印刷する方法はありますか?
j=jjj
k=kkk
l=lll
for i in j k l
do
....
done
予想される出力(各変数が別の行にある):
j = jjj
k = kkk
l = lll
上記の結果を得る方法を誰かが提案できますか?
簡単な方法で:
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
が保持する変数名の値を取得します)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'
またはzsh
でdeclare -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 )
%
${!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
参考文献: