Что касается этого вопроса (Поместите результат 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
Что я здесь делаю неправильно?



Это не будет работать с вашим синтаксисом. Вы нет заполняете массив результатом 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}".
Немного повозился с этим, и это, кажется, работает:
$ arr=$(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
$ echo $arr
1 33 4
$ echo "($arr)"
(1
33
4)
Спасибо, Брайан, за ответ!
Привет, Иниан, большое спасибо. Он функционирует. Знаете ли вы, как заполнить массив более сложной командой, как в моем другом вопросе здесь: stackoverflow.com/questions/55137242/…