Skip to content

Instantly share code, notes, and snippets.

@splaspood
Created December 13, 2011 20:34
Show Gist options
  • Star 33 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save splaspood/1473761 to your computer and use it in GitHub Desktop.
Save splaspood/1473761 to your computer and use it in GitHub Desktop.
Parsing INI Files with Bash
cfg.parser () {
fixed_file=$(cat $1 | sed 's/ = /=/g') # fix ' = ' to be '='
IFS=$'\n' && ini=( $fixed_file ) # convert to line-array
ini=( ${ini[*]//;*/} ) # remove comments
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} ) # set section prefix
ini=( ${ini[*]/%]/ \(} ) # convert text2function (1)
ini=( ${ini[*]/=/=\( } ) # convert item to array
ini=( ${ini[*]/%/ \)} ) # close array parenthesis
ini=( ${ini[*]/%\( \)/\(\) \{} ) # convert text2function (2)
ini=( ${ini[*]/%\} \)/\}} ) # remove extra parenthesis
ini[0]='' # remove first element
ini[${#ini[*]} + 1]='}' # add the last brace
eval "$(echo "${ini[*]}")" # eval the result
}
cfg.parser '/etc/my.ini'
cfg.section.images
@byrnedo
Copy link

byrnedo commented Jan 20, 2016

this is wonderful :) 👍

@Anarch157a
Copy link

Excelent. Do you mind if I improve it and add to my colection of Bash utilities ?

@encodeering
Copy link

hey

could you say anthing about the license?

@RepoFarmer
Copy link

hey

could you say anthing about the license?

bump

@splaspood
Copy link
Author

A license is a good question... I'm pretty sure this function came from someone else's script that I probably polished up.. it's been so long I can't recall. So as far as I'm concerned, I'm happy to let anyone use this as they see fit with no requirements from me.. I'd probably just go for the MIT license if I had to pick one off the cuff. However, as it's likely lifted in whole or in part from someone else's work, I'm probably not in a position to spec my own license.. Update: Did a quick google, looks like I probably got it from here, or the original blog post that's referenced there (which now seems defunct) https://stackoverflow.com/questions/6318809/how-do-i-grab-an-ini-value-within-a-shell-script

@craigvantonder
Copy link

Specifically,
This answer: https://stackoverflow.com/a/6318901/2110294
This blog post: https://web.archive.org/web/20180124065211/theoldschooldevops.com/2008/02/09/bash-ini-parser/

Here is the authors details:
Andrés J. Díaz
https://www.linkedin.com/in/andresjdl
https://twitter.com/andresjdiaz
https://github.com/ajdiaz
https://ajdiaz.me/

I've mailed him to ask if he can't possibly create a repository for this with a license.

@splaspood
Copy link
Author

Wonderful! I'll happily take this down if he would like.

@mafar
Copy link

mafar commented Jun 22, 2020

Hi @splaspood,
I am using it in script with #!/bin/sh and i get error , `cfg.parser': not a valid identifier
How can i use it in script with #!/bin/sh

@techpavan
Copy link

Those interested in even modifying the INI file can refer to this one: https://github.com/albfan/bash-ini-parser which is an enhancement from the same original source. This is under GPL v3.

Other options:
https://github.com/rudimeier/bash_ini_parser
https://github.com/pixelb/crudini

@splaspood
Copy link
Author

Pleased that people keep finding this gist useful. Thanks @techpavan for the updated source!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment