Вопрос или проблема
В этом тесте я ожидаю, что будет напечатано “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
Пояснение коду
-
Цикл
for
: Обходим значения от 1 до 3 с помощью цикла. -
Создание переменной:
export "var$num=9999"
создает и экспортирует переменную с именемvar1
,var2
илиvar3
, задавая ей значение9999
. -
Формирование имени переменной:
varname="var$num"
– здесь мы создаем строку с именем переменной для дальнейшего использования. -
Косвенное разыменование:
${!varname}
извлекает значение переменной, имя которой хранится в переменнойvarname
.
Вывод результата
При выполнении приведенного выше кода вы увидите следующее:
var1 is 9999
var2 is 9999
var3 is 9999
Заключение
Использование косвенного разыменования позволяет динамически управлять переменными в Bash, что значительно упрощает работу с переменными, когда их имена могут варьироваться. Это полезный трюк для тех, кто часто имеет дело с динамическими данными или переменными в скриптах.
Если у вас возникли дополнительные вопросы по работе с переменными в Bash или хотите обсудить другие аспекты скриптов, не стесняйтесь обращаться за разъяснениями!