问题
您正在使用i的值,就好像它是数组索引一样。不是,因为 SAMPLE1 和 SAMPLE2 是单独的变量,而不是数组。
此外,在调用时,echo SAMPLE{$i}
您只需将i的值附加到单词“SAMPLE”。您在此语句中取消引用的唯一变量是$i,这就是您得到结果的原因。
解决问题的方法
有两种主要方法可以解决这个问题:
- 内插变量的多阶段解引用,通过eval内置或间接变量扩展。
- 遍历数组,或使用i作为数组的索引。
使用eval取消引用
在这种情况下,最简单的方法是使用eval:
SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'
for (( i = 1; i <= 2; i++ )); do
eval echo \$SAMPLE${i}
done
这会将i的值附加到变量的末尾,然后重新处理结果行,扩展内插变量名称(例如SAMPLE1或SAMPLE2)。
使用间接变量取消引用
这个问题的公认答案是:
SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'
for (( i = 1; i <= 2; i++ ))
do
var="SAMPLE$i"
echo ${!var}
done
这在技术上是一个三步过程。首先,它为var分配一个插值变量名,然后取消引用存储在var中的变量名,最后展开结果。它看起来更干净一些,有些人对这种语法比使用eval更舒服,但结果基本相同。
遍历数组
您可以通过迭代数组而不是使用变量插值来简化循环和扩展。例如:
SAMPLE=('1-first.with.custom.name' '2-second.with.custom.name')
for i in "${SAMPLE[@]}"; do
echo "$i"
done
与其他方法相比,这增加了好处。具体来说:
- 您无需指定复杂的循环测试。
- 您可以通过$SAMPLE[$i]语法访问单个数组元素。
- 您可以通过${#SAMPLE}变量扩展获得元素的总数。
原始示例的实际等效性
所有三种方法都适用于原始问题中给出的示例,但数组解决方案提供了最大的整体灵活性。选择最适合您手头数据的一个。