Ceci est basé sur la réponse de Juarez Rudsatz, donc merci beaucoup de m'avoir mis dans la bonne direction.
J'ai eu un petit problème avec lui dans Ubuntu 20.04 bash.
function parse_ini() {
cat /dev/stdin | awk -v section="$1" -v key="$2" '
BEGIN {
if (length(key) > 0) { params=2 }
else if (length(section) > 0) { params=1 }
else { params=0 }
}
match($0,/;/) { next }
match($0,/#/) { next }
match($0,/^\[(.+)\]$/){
current=substr($0, RSTART+1, RLENGTH-2)
found=current==section
if (params==0) { print current }
}
match($0,/(.+)=(.+)/) {
if (found) {
if (params==2 && key==substr($1, 0, length(key))) { print substr($0, length(key)+2) }
if (params==1) { printf "%s\n",$1,$3 }
}
}'
}
Les différences ici sont le substrat dans le dernier bloc, l'exemple de Juarez ajoutait un = supplémentaire lors de l'affichage des paramètres d'une section. Il n'affichait rien non plus lors de l'affichage des options individuelles.
Pour remédier au = supplémentaire, j'ai supprimé =%s de la ligne params==1. Pour remédier aux valeurs manquantes, j'ai retravaillé la ligne params==2 presque entièrement. J'ai ajouté une correspondance pour exclure ; les lignes commentées également.
Cet exemple fonctionnera avec des fichiers INI tels que
[default]
opt=1
option=option
option1=This is just another example
example=this wasn't working before
#commented=I will not be shown
;commentedtoo=Neither Will I.
[two]
opt='default' 'opt'just doesnt get me! but 'two' 'opt' does :)
iam=not just for show
Pour utiliser ce script, ce n'est pas différent de l'exemple de Juarez.
cat options.ini | parse_ini # Show Sections
cat options.ini | parse_ini 'default' # Show Options with values
cat options.ini | parse_ini 'default' 'option' # Show Option Value
cat options.ini | parse_ini 'two' 'iam' # Same as last but from another section
Cela fonctionne bien sûr comme prévu. Alors quoi d'autre, ah oui, vous pourriez vouloir un fichier de fonctions pour désencombrer votre script, et vous voulez probablement accéder aux valeurs. Voici un exemple rapide.
app="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" # get the path to your program
source $app/functions.script # could be in a subdirectory.
somevar=$(cat $app/options.ini | parse_ini 'section' 'option') # Now its in a variable.
6 votes
Est-ce que l'une de ces réponses respecte les sections ?
0 votes
Notez que tout script qui commence par
#!/bin/sh
est un script POSIX sh, et non un script bash. C'est une distinction importante, carsh
ne dispose pas de fonctionnalités comme les tableaux et les cartes (que bash appelle "tableaux associatifs") qui sont très utiles pour construire ce genre de choses.