Как я могу создать массив из первой строки нескольких источников текста?

8

У меня есть массив путей к файлам, каждый из которых имеет несколько строк текста. Я хотел бы создать массив, который заполняется первой строкой каждого файла, обработанного следующим образом:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Самое большее, я получил только одно значение в моем массиве. Я не могу получить массив, который я ищу из цикла for. Я пробовал много вариантов, и мне было трудно понять, где я иду не так.

dimmech
источник

Ответы:

11

Вы хотели

lines+=("$line")

+=WORD это конкатенация строк (или дополнение). Назначение соединения +=(...) добавляет значения в массив.

Вы, вероятно, также хотите процитировать все ваши расширения переменных здесь - это lineопределенно нужно, если строка может содержать пробелы, но у вас могут возникнуть проблемы и в других местах.

Майкл Гомер
источник
Спасибо, теперь имеет смысл, почему в некоторых моих попытках это выглядело как результат сочетания двух строк.
Диммех
4

В Bash вы также можете напрямую читать строки в массив. Если вы выбрали текущую длину массива ${#lines[@]}в качестве индекса вставки, вы можете добавить к нему:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Синопсис выдержка

mapfile mapfile [-n count] [-O origin] [-t] [array]

Считать строки из стандартного ввода в массив переменных индексированного массива […]. Опции, если они есть, имеют следующие значения:

  • -n: Скопировать не более подсчета строк. Если число равно 0, все строки копируются.

  • -O: Начать присваивать массиву в начале индекса . Индекс по умолчанию равен 0.

  • -t: Удалить завершающий символ новой строки из каждой прочитанной строки.

Дэвид Фёрстер
источник