Самый простой способ разбить строку CSV на массив, который работает как для bash & zsh - PullRequest
0 голосов
/ 18 марта 2020

Какой самый простой способ разбить строку csv на массив, используя только встроенные функции, которые работают как для bash & zsh?

У меня есть отдельный код, который работает для bash и для zsh, но я пока не нашел ничего подходящего для обоих:

csv='a,b,c'

# Works in zsh, but not in bash
array=(${(s:,:)csv})

# Works in bash, but not in zsh
array=(${csv//,/ }) # This requires that $IFS contains the space character

1 Ответ

2 голосов
/ 19 марта 2020

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

# bash
IFS=, read -ra array <<< "$csv"

# zsh
IFS=, read -rA array <<< "$csv"

Синтаксис один и тот же; единственная разница в том, используете ли вы a или A в качестве опции для read. Я бы порекомендовал добавить условный оператор, который определяет, какая оболочка выполняет сценарий, а затем использовать переменную для хранения правильной опции.

if [ -n "$BASH_VERSION" ]; then
    arr_opt=a
elif [ -n "$ZSH_VERSION" ]; then
    arr_opt=A
fi

IFS=, read -r"$arr_opt" array <<< "$csv"

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

...