Как можно отобразить имя переменной, составленное из имен переменных, т.е. $$var1$var2

Вопрос или проблема

В этом тесте я ожидаю, что будет напечатано “var1 равно 999”.

user@penguin:~$ for num in {1..3}; do export var$num=9999 ; echo var$num равно $var$num ; done
var1 равно 1
var2 равно 2
var3 равно 3

user@penguin:~$ echo $var1 $var2 $var3
9999 9999 9999

Это выводит PID вместо переменных, названных двумя именами переменных.

user@penguin:~$ for num in {1..3}; do export var$num=9999 ; echo var$num равно $$var$num ; done
var1 равно 316var1
var2 равно 316var2
var3 равно 316var3

В вашем примере вывода вы используете $$var$num вместо $var$num, как у вас выше. Похоже на опечатку, но $$ является специальным параметром, который расширяется в PID оболочки/подоболочки, из которой он выполняется.


Тем не менее, то, что вы ищете, это косвенное расширение параметров:

for num in {1..3}; do 
    export "var$num"=9999
    varname="var$num"
    echo "var$num равно ${!varname}"
done

Ответ или решение

Для того чтобы вывести значение переменной, имя которой составлено из других переменных, вы можете использовать косвенное разыменование (indirect parameter expansion) в Bash. Рассмотрим, как это работает на примере вашего сценария.

Задача

Ваша задача состоит в том, чтобы занести значения в динамически создаваемые переменные var1, var2, var3, а затем вывести их значения в формате: "var1 is 9999".

Синтаксис Bash и косвенное разыменование

В Bash косвенное разыменование позволяет использовать содержимое одной переменной как имя другой переменной. Для этого используется синтаксис ${!имя_переменной}.

Пример кода

Вот пример кода, который выполнит описанную выше задачу:

for num in {1..3}; do 
    export "var$num=9999"
    varname="var$num"
    echo "var$num is ${!varname}"
done

Пояснение коду

  1. Цикл for: Обходим значения от 1 до 3 с помощью цикла.

  2. Создание переменной: export "var$num=9999" создает и экспортирует переменную с именем var1, var2 или var3, задавая ей значение 9999.

  3. Формирование имени переменной: varname="var$num" – здесь мы создаем строку с именем переменной для дальнейшего использования.

  4. Косвенное разыменование: ${!varname} извлекает значение переменной, имя которой хранится в переменной varname.

Вывод результата

При выполнении приведенного выше кода вы увидите следующее:

var1 is 9999
var2 is 9999
var3 is 9999

Заключение

Использование косвенного разыменования позволяет динамически управлять переменными в Bash, что значительно упрощает работу с переменными, когда их имена могут варьироваться. Это полезный трюк для тех, кто часто имеет дело с динамическими данными или переменными в скриптах.

Если у вас возникли дополнительные вопросы по работе с переменными в Bash или хотите обсудить другие аспекты скриптов, не стесняйтесь обращаться за разъяснениями!

Оцените материал
Добавить комментарий

Капча загружается...