137 votes

Comment saisir une valeur INI dans un script shell script ?

J'ai un fichier parameters.ini, tel que :

[parameters.ini]
    database_user    = user
    database_version = 20110611142248

Je veux lire et utiliser la version de la base de données spécifiée dans le fichier parameters.ini à partir d'un shell bash script pour pouvoir la traiter.

#!/bin/sh    
# Need to get database version from parameters.ini file to use in script    
php app/console doctrine:migrations:migrate $DATABASE_VERSION

Comment dois-je m'y prendre ?

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, car sh 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.

2voto

joe_evans Points 106

J'ai écrit un script python rapide et facile à inclure dans mon script bash.

Par exemple, votre fichier ini s'appelle food.ini et dans le fichier vous pouvez avoir quelques sections et quelques lignes :

[FRUIT]
Oranges = 14
Apples = 6

Copiez ce petit script et sauvegardez-le en tant que configparser.py

#!/usr/bin/python
import configparser
import sys
config = configparser.ConfigParser()
config.read(sys.argv[1])
print config.get(sys.argv[2],sys.argv[3])

Maintenant, dans votre bash script vous pourriez faire ceci par exemple.

OrangeQty=$(python configparser.py food.ini FRUIT Oranges)

o

ApplesQty=$(python configparser.py food.ini FRUIT Apples)
echo $ApplesQty

Cela présuppose :

  1. vous avez installé Python
  2. vous avez installé la bibliothèque configparser (elle devrait être fournie avec une installation python standard)

J'espère que cela vous aidera :¬)

2voto

4dummies Points 161

Certaines des réponses ne respectent pas les commentaires. Certaines ne respectent pas les sections. Certaines ne reconnaissent qu'une seule syntaxe (seulement " :" ou seulement "="). Certaines réponses Python échouent sur ma machine à cause d'une capitalisation différente ou de l'absence d'importation du module sys. Toutes sont un peu trop laconiques pour moi.

J'ai donc écrit le mien, et si vous avez un Python moderne, vous pouvez probablement l'appeler depuis votre shell Bash. Il a l'avantage d'adhérer à certaines des conventions de codage courantes de Python, et fournit même des messages d'erreur et de l'aide. Pour l'utiliser, nommez-le quelque chose comme myconfig.py (ne l'appelez PAS configparser.py ou il pourrait essayer de s'importer lui-même), rendez-le exécutable, et appelez-le comme suit

value=$(myconfig.py something.ini sectionname value)

Voici mon code pour Python 3.5 sous Linux :

#!/usr/bin/env python3
# Last Modified: Thu Aug  3 13:58:50 PDT 2017
"""A program that Bash can call to parse an .ini file"""

import sys
import configparser
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="A program that Bash can call to parse an .ini file")
    parser.add_argument("inifile", help="name of the .ini file")
    parser.add_argument("section", help="name of the section in the .ini file")
    parser.add_argument("itemname", help="name of the desired value")
    args = parser.parse_args()

    config = configparser.ConfigParser()
    config.read(args.inifile)
    print(config.get(args.section, args.itemname))

2voto

Lock-o-motiffe Points 33

L'explication à la réponse pour le one-liner sed.

[section1]
param1=123
param2=345
param3=678

[section2]
param1=abc
param2=def
param3=ghi

[section3]
param1=000
param2=111
param3=222

sed -nr "/^\[section2\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }" ./file.ini

Pour comprendre, il sera plus facile de formater la ligne comme ceci :

sed -nr "
      # start processing when we found the word \"section2\"
      /^\[section2\]/  { #the set of commands inside { } will be executed
          #create a label \"l\"  (https://www.grymoire.com/Unix/Sed.html#uh-58)
          :l /^\s*[^#].*/ p; 
          # move on to the next line. For the first run it is the \"param1=abc\"
          n; 
          # check if this line is beginning of new section. If yes - then exit.
          /^\[/ q
          #otherwise jump to the label \"l\"
          b l
          }

" file.ini

1voto

jeo Points 11

Ce script obtiendra les paramètres suivants :

ce qui signifie que si votre ini contient :

pars_ini.ksh < chemin vers le fichier ini > < nom du secteur dans le fichier ini > < le nom dans le nom=valeur à retourner >

par exemple, comment l'appeler :


[ environnement ]

a=x

[ Secteur de la base de données ]

DSN = quelque chose


Puis appeler :

pars_ini.ksh /users/bubu_user/parameters.ini DataBase_Sector DSN

cela permettra de récupérer le "quelque chose" suivant

le script "pars_ini.ksh" :

\#!/bin/ksh

\#INI_FILE=path/to/file.ini

\#INI_SECTION=TheSection

\# BEGIN parse-ini-file.sh

\# SET UP THE MINIMUM VARS FIRST

alias sed=/usr/local/bin/sed

INI_FILE=$1

INI_SECTION=$2

INI_NAME=$3

INI_VALUE=""

eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \

    -e 's/;.*$//' \

    -e 's/[[:space:]]*$//' \

    -e 's/^[[:space:]]*//' \

    -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \

   < $INI_FILE  \

    | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}"`

TEMP_VALUE=`echo "$"$INI_NAME`

echo `eval echo $TEMP_VALUE`

1voto

Andrew Newdigate Points 2264

Cette mise en œuvre utilise awk et présente les avantages suivants :

  1. Ne retournera que la première entrée correspondante
  2. Ignore les lignes qui commencent par un ;
  3. Supprime les espaces blancs de début et de fin, mais pas les espaces blancs internes.

Version formatée :

awk -F '=' '/^\s*database_version\s*=/ {
            sub(/^ +/, "", $2);
            sub(/ +$/, "", $2);
            print $2;
            exit;
          }' parameters.ini

One-liner :

awk -F '=' '/^\s*database_version\s*=/ { sub(/^ +/, "", $2); sub(/ +$/, "", $2); print $2; exit; }' parameters.ini

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X