如何打印变量名称及其值?

如何打印变量名称及其值?

有什么方法可以打印变量名称及其值吗?

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。在全局范围内,如果您不关心查看类型,也可以单独使用:yashtypeset -pzshtypeset

% 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某些特殊参数的情况一样)。

zshm还可以打印与模式匹配的变量的定义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\nj=jjj

在某些 shell 中,大括号是必需的,i例如10where的值在某些 shell 中$10会被解释为 ,${1}0而不是${10}

请注意,使用 时j='foo; bar',您会看到i=foo; bar输出。如果你想输出将使用的 shell 代码分配相同的值j(就像typeset -m jzsh 中的那样),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

相关内容