Kurt Stutsman обеспечивает правильный указатель в комментарии на вопрос: использование Bash массивы, чтобы решить вашу проблему.
Вот упрощенный пример:
groups=() # declare an empty array; same as: declare -a groups
for i in {0..5}; do
groups[i]="group $i" # dynamically create element with index $i
done
# Print the resulting array's elements.
printf '%s\n' "${groups[@]}"
см в нижней части этого ответа для других способов перечислить элементы массива ${groups[@]}
.
bash
массивы могут быть динамически расширены (и может быть даже редкие - индексы элементов не должны быть смежными)
- Следовательно, простое присваивание элементу
$i
работ, без предварительного проклейки из массив.
Обратите внимание, как $i
нужно не быть с префиксом $
в индексе массива, потому что индексы массивов оцениваются в арифметическом контексте (тот же контекст, в котором оценивается $((...))
выражения).
Что касается , что вы сделали неправильно:
group$i=...
не признается в качестве переменной уступки Bash, потому что - принято буквально - group$i
не является допустимым идентификатором (имя переменной).
Потому что это не так, Bash продолжает анализировать до следующего метасимволом оболочки не найден, а затем интерпретирует полученное слово как команды для выполнения, в вашем случае в результате сообщения об ошибке group0=j: command not found
.
Если по какой-то причине, вы не хотите использовать массив, чтобы полностью избежать этой проблемы, вы можете работы вокруг проблемы:
Привлекая переменный-декларирование встроенной [команда], такие как declare
, local
или export
, вы вынуждаете Bash выполнить РАЗЛОЖЕНИЯ первого, который расширяет group$i
к действительному против перед тем, как передать его встроенному.
user2683246's answer демонстрирует следующий лучший подход с использованием declare
(или, если локальные переменные внутри функции желательны, local
) для создания переменных.
Soren's answer использует export
, но это только целесообразно, если вы хотите создать среды переменные видимых в дочерние процессы а не просто оболочка переменных.
Caveat: С помощью этой техники, обязательно двойные кавычки РИТ для того, чтобы захватить полную стоимость; для иллюстрации:
i=0; declare v$i=$(echo 'hi, there'); echo "$v0" # !! WRONG -> 'hi,': only UP TO 1ST SPACE
i=0; declare v$i="$(echo 'hi, there')"; echo "$v0" # OK -> 'hi, there'
Других способов перечислить groups
массив, созданный выше:
# Enumerate array elements directly.
for element in "${groups[@]}"; do
echo "$element"
done
# Enumerate array elements by index.
for ((i = 0; i < ${#groups[@]}; i++)); do
echo "#$i: ${groups[i]}"
done
Я рекомендую использовать Баш массивы вместо динамических имен переменных, если это возможно. –
@KurtStutsman - Я тоже думал, что – Soren