Echo $变量$ counter in" for"循环BASH

时间:2014-10-05 23:52:03

标签: bash ubuntu

n=1
test=1000
test1=aaa

我正在尝试:

echo $test$n

获取

aaa

但是我得到了

10001

我试图以这种方式使用它因为我有变量:lignePortTCP1,lignePortTCP2,lignePortTCP1,ETC在for循环中如下:

declare -i cpt3
cpt3=0
for ((i = 1; i <= cpt; i++)); do
    cpt3=cpt3+1
    echo "Port/Protocole : $lignePortTCP$cpt3 - Nom du Service : $ligneServiceTCP$cpt3"
done

4 个答案:

答案 0 :(得分:3)

给定分配的变量

n=1
test1=aaa

...并且您希望在aaatest的值下打印n,然后将要扩展的名称放在其自己的变量中,并使用!运算符,如下所示:

varname="test$n"
echo "${!varname}"

BashFAQ #6中明确讨论了这一点。


也就是说,变量间接不是一个特别好的做法 - 通常,你可以更好地使用数组,无论是关联的还是其他的。

例如:

test=( aaa bbb ccc )
n=0
echo "${test[n]}"

...对于不是从0开始的值:

test=( [1]=aaa [2]=bbb [3]=ccc )
n=1
echo "${test[n]}"

答案 1 :(得分:0)

如果要减去test和n的值,请将计算包装在$((...))中并使用 - 运营商:

$((test-n))

答案 2 :(得分:0)

你也可以使用eval,虽然它可能并不比Charles Duffy提供的技术更好。

$ n=1
$ test=1000
$ test1=aaa
$ eval echo \${test$n}
aaa

答案 3 :(得分:0)

一种方法是使用${!},但您必须将组合名称存储在自己的变量中才能使用:

var=test$n
echo "${!var}"

如果你可以控制首先如何分配变量,那么使用数组会更好。您可以将值分配给lignePortTCP1lignePortTCP2等,而不是lignePortTCP[0]lignePortTCP[1]等,然后使用${lignePort[$n]}检索它们。