Вы используете значение i , как если бы это был индекс массива. Это не так, потому что SAMPLE1 и SAMPLE2 являются отдельными переменными, а не массивом.
Кроме того, при вызове echo SAMPLE{$i}
вы добавляете значение i к слову "ОБРАЗЕЦ." Единственная переменная, которую вы разыгрываете в этом выражении, - $ i, поэтому вы получили результаты, которые вы сделали.
Существует два основных способа решения этой проблемы :
Самое простое в этом дело ситуация заключается в использовании eval :
SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'
for (( i = 1; i <= 2; i++ )); do
eval echo \$SAMPLE${i}
done
Это добавит значение i в конец переменной и затем обработает результирующую строку , расширяя имя интерполированной переменной (например, SAMPLE1 или SAMPLE2 ).
Принятый ответ для этого вопрос:
SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'
for (( i = 1; i <= 2; i++ ))
do
var="SAMPLE$i"
echo ${!var}
done
Это технически трехэтапный процесс. Во-первых, он присваивает имя интерполированной переменной var , затем разделяет имя переменной, хранящуюся в var , и, наконец, расширяет результат. Это выглядит немного чище, и некоторые люди более удобны с этим синтаксисом, чем с eval , но результат в основном тот же.
Вы можете упростить как цикл, так и расширение путем итерации по массиву вместо использования переменной интерполяции. Например:
SAMPLE=('1-first.with.custom.name' '2-second.with.custom.name')
for i in "${SAMPLE[@]}"; do
echo "$i"
done
Это добавило преимущества по сравнению с другими методами. В частности:
Все три метода будут работать для пример, заданный в исходном вопросе, но решение массива обеспечивает максимальную гибкость. Выберите тот, который лучше всего подходит для данных, которые у вас есть.
Свойство задач не должно быть напечатано как AngularFireObject <any[] > ;
.
Учитывая, что .valueChanges()
всегда будет возвращать наблюдаемое, его следует напечатать как Observable<any>
(как пример в документации )