Как построить имя переменной в Bash? - PullRequest
3 голосов
/ 01 июля 2011

Я хочу построить имя переменной N_foo и N_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_foo и N_bar в двухвнутренние петли и распечатать 1, 2 и 1, 2, 3 соответственно.Какой правильный синтаксис?

Ответы [ 4 ]

5 голосов
/ 01 июля 2011
#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    i2="N_$i"
    seq 1 ${!i2}
done
5 голосов
/ 01 июля 2011
#!/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
3 голосов
/ 01 июля 2011

Вы можете использовать опорный оператор косвенной переменной:

Пример

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

, который дает этот вывод:

nfoo
1
0 голосов
/ 01 июля 2011

В итоге я использовал следующий код. Используется метод подстановки параметров (см. 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

! - это параметр расширения истории (ср. http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters). !j_max будет заменен самым последним значением, установленным на j_max, равным N_foo / N_bar в 1-й и 2-й итерации. Затем он вызывает ${N_foo} / ${N_bar}, который имеет значение 2/3 в 1-й / 2-й итерации.

...