如何将值传递给另一个变量中的变量

如何将值传递给另一个变量中的变量

运行此代码时出现“错误替换”错误。我想用循环打印h_1, h_2,中的值。h_3for

#/!/bin/bash
h_1=12
h_2=13
h_3=14
for ((i=1; i<=2; i++))
 do
  echo "${h_$i}"
done

答案1

你需要使用间接参数扩展!

tmp=h_$i
echo "${!tmp}

您必须tmp在此处创建额外的变量 - 不幸的是,您不能只使用字符串。间接扩展的工作原理如下:

如果参数的第一个字符是感叹号 (!),则引入一级变量间接寻址。 Bash 使用由参数的其余部分形成的变量的值作为变量的名称;然后扩展该变量,并在其余替换中使用该值,而不是参数本身的值。这称为间接扩展。

因此,上面的${!tmp}扩展为变量的值,该变量的名称由价值变量tmp.

也可以使用eval在这里,但间接方法更简洁。

答案2

我会使用双括号形式,即所谓的Arithmetic Expansion:

echo $((h_$i))

不需要数组、临时变量或其他花哨的东西。另外,我相信这种形式是最可移植的(据我所知,POSIX 需要算术扩展)。

来自 Bash 手册:

算术展开允许计算算术表达式并替换结果。算术展开式的格式为:

          $((expression))

该表达式被视为位于双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都会经历参数扩展、字符串扩展、命令替换和引号删除。算术展开式可以嵌套。

相关内容