Я пытаюсь собрать строковые значения в bash script. Каков самый простой способ, которым я могу добавить строковые значения в структуру списка или массива, чтобы я мог повторить их в конце?
Переменный список или структура массива в Bash? Как я могу легко добавить к нему?
Ответ 1
$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4
Так как Bash использует разреженные массивы, вы не должны использовать число элементов ${#arr}
в качестве индекса. Однако вы можете получить массив таких индексов:
$ indices=(${!arr[@]})
Ответ 2
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done
Ответ 3
Довольно неясным синтаксисом добавления в конец массива в bash является:
myarr[${#myarr[*]}]="$newitem"
Ответ 4
Чтобы добавить к тому, что Игнасио предложил в другом ответе:
foo=(a b c)
foo=("${foo[@]}" d) # push element 'd'
foo[${#foo[*]}]="e" # push element 'e'
for i in "${foo[@]}"; do echo "$i" ; done
Ответ 5
$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3
Ответ 6
Несмотря на то, что на вопрос ответили и он довольно старый, я хотел бы поделиться решением для пространства имен, поскольку он работает значительно быстрее, чем любые другие способы, кроме ennukiller. (на моих тестах на 100 килограммов он выиграл ~ 12 секунд против моих ~ 14 секунд, тогда как для решения списка-append потребуется несколько минут).
Вы можете использовать следующий трюк:
# WORKS FASTER THAN THESE LAME LISTS! ! !
size=0;while IFS= read -r line; do
echo $line
((++size))
eval "SWAMP_$size='$line'"
done
Или вы можете сделать следующее:
#!/bin/bash
size=0
namespace="SWAMP"
ArrayAppend() {
namespace="$1"
# suppose array size is global
new_value="$2"
eval "${namespace}_$size='$2'"
eval "echo \$${namespace}_$size"
((++size))
}
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
Пока интерпретатор находится в списке тегов, здесь ссылка для объектно-ориентированная bash.