Bash - получить пустой массив в ответ на macOS - PullRequest
3 голосов
/ 13 марта 2019

Относительно этого вопроса ( Поместить результат 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

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

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

$ arr=$(echo "v1.33.4" |  egrep -o '[0-9]{1,3}')
$ echo $arr
1 33 4
$ echo "($arr)"
(1
33
4)
1 голос
/ 13 марта 2019

Это не будет работать с вашим синтаксисом. Вы не заполняете массив результатом 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}".

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