Настройка IFS для игнорирования пробелов при чтении из строки здесь

У меня небольшая проблема с IFS, чтобы различать пакеты и дистрибутив. Теперь я хотел добавить номер версии CentOS, но проблема в том, что CentOS и номер 6 разделены IFS. У меня вопрос: как заставить IFS игнорировать пробелы и рассматривать их как одно значение? Заранее спасибо :)

...

PACKET_MANAGERS=(
    "Debian|package:package:package|apt:dpkg-query|"
    "CentOS 6|package:package:package|yum:rpm|${CentOS_6_REPO}"
    ...
)
...
   for system in ${PACKET_MANAGERS[@]}
do
    IFS='|' read -r -a data <<< $system
    debug "Testing ${system} => ${data[0]}"

    if echo "${SYSTEM_NAME}" | grep "${data[0]}" &>/dev/null; then
        SYSTEM_NAME_DETECTED="${data[0]}"
    else
        continue
    fi

...

done

person jamefane    schedule 08.08.2018    source источник


Ответы (1)


Вы должны процитировать ${PACKET_MANAGERS[@]}:

for system in "${PACKET_MANAGERS[@]}"

В противном случае разделение на слова будет выполняться в результате расширения выражения массива, поэтому каждое слово в каждом элементе массива будет отдельной итерацией цикла for. Использование [@] сделает каждый элемент массива отдельным словом в результате.

person Barmar    schedule 08.08.2018
comment
Привет и спасибо за ответ, но, к сожалению, он не работает с $ system? - person jamefane; 08.08.2018
comment
Также необходимо указать "${PACKET_MANAGERS[@]}". ShellCheck указывает на обе эти проблемы. - person that other guy; 08.08.2018
comment
Вам нужно только указать $system, чтобы обойти ошибки в старой версии bash. Строка здесь не должна подвергаться разделению на слова. - person chepner; 08.08.2018
comment
Как еще это можно было реализовать? - person jamefane; 08.08.2018
comment
@jamefane Я обновил ответ, чтобы сказать, что вам нужно процитировать ${PACKET_MANAGERS[@]} - person Barmar; 08.08.2018