Introduction ------------ Functions for parsing INI-style file natively in bash. The INI file format supports the following features: Sections: [section] Properties: name=value Comments: ; comment # comment Blank lines and trailing writespace are ignored as is whitespace around the '=' - ie. name = value is equivalent to name=value Whitespace and quotes within a value are preserved (though values don't in general need to be quoted and will not be subject to shell parameter splitting) Values can be continuted onto subsequent lines if these are prefixed with whitespace - ie. name=line1 line2 is equivalent to: name = line1 line2 Properties are stored in the global _CONFIG array as ( k1 v1 k2 v2 ... ) with keys in the format "<section>.<name>" (properties without an associated section are stored as ".<name>". In most cases this is transparent as the list/get commands can be used to query the data The functionality is more or less equivalent to the Python ConfigParser module with the following exceptions - Properties are allowed outside sections - Multi-line properties are joined with ' ' rather than '\n' (due to shell quoting issues) Usage ----- Given the following ini file (test.ini) - ; A test ini file global = a global value [section1] abc = def ; a comment ghi = jkl [section2] xyz = abc ; extends over two lines def Parse config file - $ parseIniFile < test/t2.ini $ listKeys .global section1.abc section1.ghi section2.xyz $ listAll .global a global value section1.abc def section1.ghi jkl section2.xyz abc def $ listSection section1 section1.abc def section1.ghi jkl $ getProperty global a global value $ getProperty section2.xyz abc def $ getPropertyVar XYZ section2.xyz && echo OK OK $ echo ">${XYZ}<" >abc def< Commands -------- parseIniFile < file Parse ini file (reads from stdin) and saves data to global _CONFIG var listKeys List keys present in config file in format "<section>.<property>" listAll List keys and data in format "<section>.<property> <value>" listSection <section> List keys and data for given section (sepcified as $1) in format "<property> <value>" getProperty [name|section.name] Print value for given property (sepcified as $1) Properties without a section can be queried directly as "name" (rather than ".name") Returns 0 (true) if property found otherwise 1 (false) getPropertyVar <variable> [name|section.name] Save value for given property (sepcified as $2) into shell variable (specified as $1) Properties without a section can be queried directly as "name" (rather than ".name") Returns 0 (true) if property found otherwise 1 (false)