переменная вызова bash, встроенная в цикл - PullRequest
0 голосов
/ 03 октября 2019

некоторые переменные созданы, но я не знаю, как их вызывать.

Я пытался:

echo "$r$z"
echo $($r$z)
echo "$($r$z)"

или

echo "$r$i"
echo $($r$i)
echo "$($r$i)"

вот способЯ строю переменные:

z=0;for i in {1..3};do y=$(( RANDOM % 10 ));r[z++]=$y;done

или

for i in {1..3};do eval "r$i=$(( RANDOM % 10 ))";done

ожидаемый результат должен быть:

r1r2r3

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Может быть лучше хранить их в массиве, а не создавать переменные r1, r2 и r3. Это потому, что, на самом деле, нет способа создать переменные из других переменных.

$ r=(0);
$ z=0;
$ for i in {1..3}; do
    (( y = RANDOM % 10 ));
    r+=($y);
done
$ for i in ${r[@]}; do echo $i; done

Это производит массив с тремя целыми числами, в моем случае:

8
1
9
1 голос
/ 03 октября 2019

Лучше всего спроектировать использование массивов вместо имен переменных, созданных вручную, поэтому ответ Байу - это то, что вы ищете.

Теперь существует способ расширения переменных, имя которых находится в другой переменной, существует. в Bash (без использования eval) и называется косвенное расширение. Вы найдете некоторую информацию об этом в разделе Расширение параметров оболочки справочного руководства .

В вашем случае это будет выглядеть так:

for i in {1..3}; do
    # You need to create an auxiliary variable with the name of the variable to expand
    varname=r$i
    # Then use the indirect expansion (it's prefixed with an exclamation mark)
    echo "${!varname}"
done

Это считается плохой практикой, и ее следует по возможности избегать: лучше использовать массивы.


Еще один комментарий о способе создания переменных без использования eval - использование declare или printf. Вот как это происходит с printf:

for i in {1..3}; do
    printf -v "r$i" "%d" "$((RANDOM % 10))"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...