An INI file provides an old-timey way to configure applications. On MSDOS and early versions of Windows, it was the primary configuration mechanism. (Sadly, it’s been mostly replaced by the stupid registry.) Fortunately, INI files are still around because they remain very useful. On Linux, many developers have adapted the format.
Years ago Your JoeDog wrote an INI parser in sh. This enabled him to use one config file across multiple SAP landscapes. Each section of the file, is headed by the landscape name: [D] [Q] [P] etc. A script’s configuration varied depending on which landscape it was launched in. This enabled us to test on one landscape and promote the script without any changes to the next one.
Recently a colleague needed this type of one-with-many configuration. She needed to loop through a list of servers and reference their many attributes. Your JoeDog dusted off this parser for her and now he’s passing it along to you.
Consider this INI file:
# # The parser supports comments [WEB] srv = www.joedog.org usr = jdfulmer file = haha.txt path = /usr/local/content/www
[FTP] srv = ftp.joedog.org usr = jeff file = papa.txt path = /usr/local/content/ftp
Now here’s a script that contains our parser along with an example of how to use it:
#!/bin/sh
##++ ## Parses an INI style file: ## [section] ## attr=thing ## key=val ## [header] ## thing=another ## foo=bar ## <p> ## @param file full path to the INI file ## @param section a header that matches the stuff in brackets [section] ## @return void (the variables are made available to your script) ##-- ini_parser() { FILE=$1 SECTION=$2 eval $(sed -e 's/[[:space:]]*=[[:space:]]*/=/g' -e 's/[;#].*$//' -e 's/[[:space:]]*$//' -e 's/^[[:space:]]*//' -e "s/^(.*)=([^"']*)$/1="2"/" < $FILE | sed -n -e "/^[$SECTION]/I,/^s*[/{/^[^;].*=.*/p;}") }
# A sections array that we'll loop through SECTIONS="WEB FTP"
for SEC in $SECTIONS; do ini_parser "papa.conf" $SEC echo "scp $file $usr@$srv:$path/$file" done exit
Now let’s run this script and see what happens:
Pom $ sh papa scp haha.txt [email protected]:/usr/local/content/www/haha.txt scp papa.txt [email protected]:/usr/local/content/ftp/papa.txt