Изменяемый список или структура массива в Bash? Как я могу легко добавить к нему? - PullRequest
54 голосов
/ 06 января 2010

Я пытаюсь собрать строковые значения в скрипте bash. Какой самый простой способ добавить строковые значения в структуру списка или массива, чтобы я мог их выводить в конце?

Ответы [ 6 ]

94 голосов
/ 06 января 2010
$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4

Поскольку Bash использует разреженные массивы, вы не должны использовать количество элементов ${#arr} в качестве индекса.Однако вы можете получить массив индексов, таких как:

$ indices=(${!arr[@]})
11 голосов
/ 06 января 2010
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done
3 голосов
/ 06 января 2010

Чтобы добавить к тому, что Игнасио предложил в другом ответе:

foo=(a b c)
foo=("${foo[@]}" d) # push element 'd'

foo[${#foo[*]}]="e" # push element 'e'

for i in "${foo[@]}"; do echo "$i" ; done
2 голосов
/ 06 января 2010
$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3
2 голосов
/ 06 января 2010

Довольно неясный синтаксис для добавления в конец массива в bash:

myarr[${#myarr[*]}]=”$newitem”
0 голосов
/ 13 июля 2015

Несмотря на то, что на вопрос дан ответ, и он довольно старый, я хотел бы поделиться решением для пространства имен, поскольку оно работает значительно быстрее, чем любые другие способы, кроме ответа ennukiller (в моих тестах по 100 тыс. Строк он выиграл ~ 12 секунд против моих ~ 14 секунд, тогда как решение с добавлением списка заняло бы несколько минут).

Вы можете использовать следующий трюк:

# 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...