有什么方法可以打印变量名称及其值吗?
j=jjj
k=kkk
l=lll
for i in j k l
do
....
done
预期输出(每个变量占单独一行):
j = jjj
k = kkk
l = lll
任何人都可以建议一种方法来获得上述结果吗?
答案1
Bash 中的一个简单方法:
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
)
答案2
如果您有 bash v4.4 或更高版本,则可以使用${VAR@A}
参数扩展运算符。
Bash 手册中的以下部分讨论了此问题3.5.3 Shell参数扩展
“A”运算符
扩展是赋值语句或声明命令形式的字符串,如果对其求值,将重新创建参数及其属性和值。
因此,你可以这样做:
j="jjj"
k="kkk"
l="lll"
for i in {j,k,l}; do
echo "${!i@A}"
done
你的结果应该是:
j='jjj'
k='kkk'
l='lll'
答案3
或在ksh
,,zsh
或使用bash
。在全局范围内,如果您不关心查看类型,也可以单独使用:yash
typeset -p
zsh
typeset
% j=jjj; k=kkk; l=(l l l)
% for v in j k l; do typeset -p "$v"; done
typeset j=jjj
typeset k=kkk
typeset -a l=( l l l )
(仅限 zsh):
% typeset j k l
j=jjj
k=kkk
l=( l l l )
在 zsh 中, with 的变体-p
不会显示带有该hideval
标志的变量的值(与typeset -H
某些特殊参数的情况一样)。
zsh
m
还可以打印与模式匹配的变量的定义typeset -m
(并且也适用于函数或typesetsilent
设置了选项):
$ typeset -m '[j-l]'
j=jjj
k=kkk
l=( l l l )
答案4
在标准sh
语法中,那就是:
j=jjj
k=kkk
l=lll
for i in j k l
do
eval 'printf "%s\n" "$i=${'"$i"'}"'
done
也就是说,要求 shell 将 与 的扩展连接起来解释为 shell 代码,printf "%s\n" "$i=${
因此例如对于,它解释为:$i
}"
i=j
printf "%s\n" "$i=${j}"
它曾经使用和作为参数来eval
调用该printf
命令。%s\n
j=jjj
在某些 shell 中,大括号是必需的,i
例如10
where的值在某些 shell 中$10
会被解释为 ,${1}0
而不是${10}
。
请注意,使用 时j='foo; bar'
,您会看到i=foo; bar
输出。如果你想输出将使用的 shell 代码分配相同的值j
(就像typeset -m j
zsh 中的那样),POSIXly,你可以这样做:
show_var() (
for _var do
eval 'set -- "$@" "$_var" "${'"$_var"'}"'
shift
done
LC_ALL=C awk -v q="'" -- '
function shquote(s) {
gsub(q, "&\\\\&&", s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) print ARGV[i]"="shquote(ARGV[++i])
}' "$@"
)
进而:
show_var j k l