В POSIX sh
вам потребуется eval
для использования переменных с динамическими именами.
i=0
while [ "$i" -le 3 ]
do
eval '
var'"$i"'="hello${i}"
echo "var$i = ${var'"$i"'}"
'
i=$((i+1))
done
echo "${var1}"
При использовании eval
очень важно убедиться, что в аргументе, переданном в eval
(, раскрываются только те переменные, которые необходимо расширить, и что их значение очищается (здесь мы знаем, что это безопасные последовательности десятичные цифры )).
Выше только два $i
расширены. Для этого мы выходим из одинарных (сильных )кавычек и вставляем $i
внутри двойных кавычек:eval '...'"$i"'...'
.
Так как очень трудно получить правильное цитирование (и опасно, если вы не ), лучше максимально ограничить использование eval
. В идеале только передать содержимое динамической переменной в статическую и/или обратно как:
i=0
while [ "$i" -le 3 ]
do
var=hello$i # $var with static name
eval "var$i=\$var" # transfer into variable with dynamic name
echo "var$i = $var" # use var with static name instead of dynamic one
# everywhere else (for which we don't need eval)
i=$((i+1))
done
echo "${var2}"
В ksh
/zsh
/bash
/yash
вы можете использовать массивы вместо (или ассоциативные массивы в ksh93
, zsh
или последние версии bash
). Обратите внимание, что индексы массивов ksh
/bash
начинаются с 0
, а массивы являются разреженными (, больше похожими на ассоциативные массивы с ключами, ограниченными положительными целыми числами ), в то время как во всех других оболочках (, включая zsh
и yash
на фронте типа Bourne -), индексы начинаются с 1, а массивы являются обычными массивами.
В ksh
/ bash
/zsh -o ksharrays
:
unset -v var
i=0; while [ "$i" -le 3 ]; do
var[i]=hello$i
echo "var[$i]=${var[i]}"
i=$((i+1))
done
echo "${var[1]}"
Или используя другое ((...))
расширение синтаксиса POSIX sh
, общее для ksh
/ zsh
/bash
:
unset -v var
i=0; while ((i <= 3)); do
var[i]=hello$i
echo "var[$i]=${var[i]}"
((++i))
done
echo "${var[2]}"
Или с ksh93
, bash
,zsh -o ksharrays
:
unset -v var
for ((i = 0; i <= 3; i++)); do
var[i]=hello$i
echo "var[$i]=${var[i]}"
done
echo "${var[3]}"