LINUX.ORG.RU

Пробелы в элементах массива

 


0

1

Привет, нубский вопрос.
Если сделать:

$ ar=("dsfsd dfsdfd")

то #ar[@] == 1, элемент массива без кавычек. Если

$ ar=($(echo "\"dsfsd dfsdfd\""))

то #ar[@] == 2, кавычки ушли в элементы массива, а не использовались для разбивки слов. Как заставить 2ой вариант работать как ожидается (принять выхлоп внешней команды, кавычки для ворд сплитинга, один элемент массива).

ЗЫ: на самом деле внешнеяя команда сложнее тупого echo, естественно.

★★

Ответ на: комментарий от legolegs

Не, ну так не пойдёт

ar=("$(echo "\"dsfsd dfsdfd\" element2")")

это будет один элемент (ожидалось 2). Что-то мне подсказывает, что решения нет (парсинг выхлопа с заменой пробелов на \n в нужных местах + установка IFS не в счёт).

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

только помни, при использовании эвала нужно правильно экранировать содержимое подставляемых переменных, если они содержат спецсимволы ( $ ( ; \ ` и т.д. ), чтобы не произошло ненужной подстановки

teod0r ★★★★★
()
Ответ на: комментарий от teod0r

только помни, при использовании эвала нужно правильно экранировать содержимое подставляемых переменных,

Как вы вообще поняли, что хочет ТС? Я вот так и не. Если " он хочет как обычный символ, то непонятно, что делать с пробелом? Это разделитель? А два пробела тогда что? А перевод строки тоже просто разделитель как пробел будет или нет? По-моему, налицо непонимание ни синтаксиса, ни умения формулировать задачу :(

vodz ★★★★★
()
Ответ на: комментарий от vodz

Не всё в этом мире можно формализовать

anonymous
()
Ответ на: комментарий от pavlick

работать как ожидается (принять выхлоп внешней команды, кавычки для ворд сплитинга, один элемент массива).

это будет один элемент (ожидалось 2)

Ты определись уже, два или один.

В любом случае eval не нужен.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Ну решение уже подсказали. А вообще есть внешняя cmd, которая выдаёт периодическую последовательность (период == 3)

234 433 "в третьем элементе могут быть пробелы" ...

задача была впихнуть в массив каждое поле последовательности целиком, а не - 234, 433, "в, третьем, элементе, …

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

УМНИП, у него просто от eval бомбит, зря объясняешь

anonymous
()
Ответ на: комментарий от pavlick
function команда {
    echo '234 433 "в третьем элементе могут быть пробелы" "в четвёртом $BASH [$USD] $(whoami)"'
}

IFS=$'\n' read -rd '' -a ar < <( команда | xargs  printf "%s\n")
# проверка:
printf '<%s>\n' "${ar[@]}"
<234>
<433>
<в третьем элементе могут быть пробелы>
<в четвёртом $BASH [$USD] $(whoami)>

А вот что выдаст eval:

eval ar=($(команда))
printf '<%s>\n' "${ar[@]}"
<234>
<433>
<в третьем элементе могут быть пробелы>
<в четвёртом /bin/bash [] username>
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от pavlick

IFS=$'\n' read -rd '' - общепринятый способ заставить bash читать данные в переменную построчно (а не пословно, как он это обычно делает).

-a ar означает чтение сразу в массив ar.

< это перенаправление ввода

<( ... ) - это такой сособ подставить выхлоп программы туда, где обычно ожидается содержимое файла.

xargs искаропки умеет правильно разбирать кавычки.

Собственно, я обычно не кладу ничего в массив, а сразу xargs’ом вызываю нужные программы (вместо printf), так проще.

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.