如何在Bash中构造变量名?

时间:2011-07-01 02:58:02

标签: bash escaping symbols

我想构建变量名N_fooN_bar,并在下面使用它们的值:

#!/bin/bash
N_foo=2
N_bar=3
for i in { "foo" "bar" }
do
    for j in { 1..$(`N_$i`) }
    do
        echo $j
    done
done

我想在两个内部循环中使用N_fooN_bar的值,并分别打印出1,2和1,2,3。什么是正确的语法?

4 个答案:

答案 0 :(得分:5)

#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    i2="N_$i"
    seq 1 ${!i2}
done

答案 1 :(得分:5)

#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    key="N_${i}"
    eval count='$'$key
    for j in `seq 1 $count`
    do
        echo $j
    done
done

答案 2 :(得分:3)

您可以使用间接变量引用运算符:

实施例

var="foo"
nfoo=1
ref=n${var}
echo $ref
echo ${!ref}

这给出了这个输出:

nfoo
1

答案 3 :(得分:0)

我最终使用以下代码。它使用参数替换技术(c.f。http://tldp.org/LDP/abs/html/parameter-substitution.html)。

#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
j_max=N_$i
for (( j=1;  j<=${!j_max}; j++ ))
    do
    echo $j
    done
done

!是历史记录扩展参数(c.f。http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters)。 {1}}将替换为!j_max的最新值,即第一次/第二次迭代中的j_max / N_foo。然后调用N_bar / ${N_foo},在第一次/第二次迭代中值为2/3。