Странное поведение с Bash, Arrays и пустыми пространствами - PullRequest
0 голосов
/ 29 августа 2018

Проблема: Написание сценария bash, я пытаюсь импортировать список продуктов, которые находятся внутри файла CSV в массив:

#!/bin/bash
    PRODUCTS=(`csvprintf -f "/home/test/data/input.csv" -x | grep "col2" | sed 's/<col2>//g' | sed 's/<\/col2>//g' | sed -n '1!p' | sed  '$ d' | sed 's/    //g'`)

    echo ${PRODUCTS[@]}

В интерактивной оболочке результат / вывод выглядит следующим образом:

burger
special fries
juice - 300ml

Когда я использую те же самые команды в bash-скрипте, даже отлаживая с bash -x script.sh, в части echo ${PRODUCTS[@]}, результатом массива будет всех имен файлов, расположенных в / home / test / data / и:

burger
special
fries
juice
- 
300ml

Массив принимает список каталогов и запутывает переводы строк. Этого не происходит в интерактивной оболочке (единственная командная строка). Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 30 августа 2018

Глядя на документы для csvprintf , вы конвертируете CSV в XML, а затем анализируете его с помощью регулярных выражений. Это вообще очень плохая идея.

Возможно, вы захотите установить csvkit , тогда вы можете сделать

csvcut -c prod input.csv | sed 1d

Или вы можете использовать язык, который поставляется с модулем синтаксического анализа CSV. Например, рубин

ruby -rcsv -e 'CSV.read("input.csv", :headers=>true).each {|row| puts row["prod"]}'

Какой бы метод вы ни использовали, считайте результаты в массив bash с помощью этой конструкции

mapfile -t products < <(command to extract the product data)

Затем для печати элементов массива:

for prod in "${products[@]}"; do echo "$prod"; done
# or
printf "%s\n" "${products[@]}"

Кавычки вокруг расширения массива являются критическими. Если пропущено, вы увидите одно слово в строке.


Совет: не используйте имена переменных ALLCAPS в оболочке: оставьте их для оболочки. Однажды вы напишите PATH=something, а затем удивитесь, почему ваш скрипт не работает.

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