См. https://github.com/DRVTiny/bash4-debug-infra/blob/master/config.func
Пользоваться так:
eval "$(read_ini /PATH/TO/INI)"
В результате для конфиг-файла вида:
[global]
USER_HOME={{getent passwd myuser | cut -d: -f6}}
BIN_DIR={{global.USER_HOME}}/bin
[checker]
SHELL_SCRIPT={{global.BIN_DIR}}/checker.sh
INIglobal[USER_HOME]="/home/myuser"
INIglobal[BIN_DIR]="/home/myuser/bin"
INIchecker[SHELL_SCRIPT]="/home/myuser/bin/checker.sh"
В чём профит по сравнению с просто source кода на BASH:
1) Языкоиндифферентность самого конфиг-файла. Без использования макропеременных внутри INI-файла можно будет читать его уже разработанными функциями для других языков программирования.
С использованием макропеременных ввиду их нестандартности для INI-формата, нужно реализовать их подстановку на любом удобном для вас языке (на Perl это делается элементарно).
2) INI-файл структурирован, уникальность имён переменных обязательна только в пределах одной секции, что весьма удобно для действительно больших конфиг-файлов
P.S.Разумеется, работает только на BASH4. Если вы до сих пор пользуетесь BASH3 - убейте себя об стену.