Bash — получить пустой массив в ответ на macOS

Что касается этого вопроса (Поместите результат grep, разделенный строкой, в массив), когда я использую

echo v1.33.4 | arr=($(egrep -o '[0-9]{1,3}'))

с GNU bash, version 5.0.2(1)-release (x86_64-apple-darwin18.2.0) на macOS

Я получаю пустой массив arr в обмен на

echo "($arr)"
()

тогда ожидаемый результат

1
33
4

Что я здесь делаю неправильно?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
3
0
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это не будет работать с вашим синтаксисом. Вы нет заполняете массив результатом grep. Вы не обрабатываете строку, переданную по каналу, и не заполняете пустой массив на полученном конце канала.

Возможно, вы собирались сделать

array=($(echo v1.33.4 | egrep -o '[0-9]{1,3}'))

Обратите внимание, как echo строки передается на стандартный ввод egrep, который отсутствовал в вашей попытке.

Но, как и в связанном ответе, использование mapfile было бы лучшим вариантом здесь, потому что при описанном выше подходе, если результаты поиска содержат слова, содержащие пробелы, они будут храниться в отдельных индексах в массиве, а не в одном.

mapfile -t array < <(echo "v1.33.4" |  egrep -o '[0-9]{1,3}')
printf '%s\n' "${array[@]}"

Обратите внимание, что расширение массива в bash использует синтаксис "${array[@]}", а не простое расширение "${array}".

Привет, Иниан, большое спасибо. Он функционирует. Знаете ли вы, как заполнить массив более сложной командой, как в моем другом вопросе здесь: stackoverflow.com/questions/55137242/…

Til Hund 13.03.2019 14:49

Немного повозился с этим, и это, кажется, работает:

$ arr=$(echo "v1.33.4" |  egrep -o '[0-9]{1,3}')
$ echo $arr
1 33 4
$ echo "($arr)"
(1
33
4)

Спасибо, Брайан, за ответ!

Til Hund 13.03.2019 14:49

Другие вопросы по теме