Читаем INI-файл: что может быть проще?

  • BASH
Как ни странно, INI-файлы читаются на BASH не сложнее, чем на любом другом языке, а по мне — так даже элегантнее.

Вот вам пример, который можно сделать ещё короче, если немного покумекать:


#!/bin/bash
read_ini () {
  local file="$1"
  local arr_name="$2"
  local -A ini_conf
  while read l; do
    if [[ $l =~ ^\[([^]]+)\] ]]; then
            section=${BASH_REMATCH[1]}
    elif [[ $l =~ ^([^=[:space:]]+)[[:space:]]*=[[:space:]]*(.+)$ ]]; then
            source <(cat <<CODE
            ini_conf["${section:+${section}.}${BASH_REMATCH[1]}"]=${BASH_REMATCH[2]}
CODE
)   
    fi
  done < <(sed -r -e '/^\s*([#;].*)$/d' -e 's%^\s+%%; s%\s+$%%' "$file")
  local t=$(declare -p ini_conf)
  [[ $arr_name ]] && echo ${t/declare -A ini_conf=/declare -A ${arr_name}=} || echo "$t"
}
 
read_ini "$@"


Дерзайте и дерзновенны будете! К чему бы это я? А к тому, что source в BASH — обалденно мощная и удобная штука, намного лучше eval, вынуждающего экранировать кавычки и далеко не всегда дающего адекватные результаты. Не стесняйтесь чаще и больше пользоваться source'ом!

Собственно, именно source'ом и нужно «подобрать» вывод функции read_ini, дабы получить ассоциативный массив, имя которого передаётся вторым параметром.

Возникли вопросы? Пишите в комментариях — буду рад ответить.
За сим до новых встреч!

0 комментариев