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.

19voto

pixelbeat Points 12073

Vous pouvez utiliser crudini pour obtenir les valeurs ini, par exemple :

DATABASE_VERSION=$(crudini --get parameters.ini '' database_version)

16voto

PenguinLust Points 100

Toutes les solutions que j'ai vues jusqu'à présent ont également touché les lignes commentées. Celle-ci ne l'a pas fait, si le code du commentaire est ; :

awk -F '=' '{if (! ($0 ~ /^;/) && $0 ~ /database_version/) print $2}' file.ini

14voto

jm666 Points 17312

Une ou plusieurs solutions possibles

dbver=$(sed -n 's/.*database_version *= *\([^ ]*.*\)/\1/p' < parameters.ini)
echo $dbver

10voto

Dean Rather Points 7856

Afficher la valeur de ma_clé dans un style ini mon_fichier :

sed -n -e 's/^\s*my_key\s*=\s*//p' my_file
  • -n -- n'imprime rien par défaut
  • -e -- exécuter l'expression
  • s/PATTERN//p -- afficher tout ce qui suit ce modèle Dans le modèle :
  • ^ -- le motif commence au début de la ligne
  • \s -- caractère d'espacement
  • * -- zéro ou plusieurs (caractères d'espacement)

Ejemplo:

$ cat my_file
# Example INI file
something   = foo
my_key      = bar
not_my_key  = baz
my_key_2    = bing

$ sed -n -e 's/^\s*my_key\s*=\s*//p' my_file
bar

Donc :

Trouver un motif où la ligne commence par zéro ou plusieurs caractères d'espacement, suivi de la chaîne de caractères ma_clé suivi de zéro ou plusieurs caractères d'espacement, d'un signe égal, puis de zéro ou plusieurs caractères d'espacement à nouveau. Affichez le reste du contenu de cette ligne en suivant ce modèle.

10voto

argentpepper Points 574

Comme pour les autres réponses Python, vous pouvez le faire en utilisant la fonction -c pour exécuter une séquence d'instructions Python données sur la ligne de commande :

$ python3 -c "import configparser; c = configparser.ConfigParser(); c.read('parameters.ini'); print(c['parameters.ini']['database_version'])"
20110611142248

Cela présente l'avantage de ne nécessiter que la bibliothèque standard Python et de ne pas écrire un fichier script distinct.

Ou utilisez un document ici pour une meilleure lisibilité, ainsi :

#!/bin/bash
python << EOI
import configparser
c = configparser.ConfigParser()
c.read('params.txt')
print c['chassis']['serialNumber']
EOI

serialNumber=$(python << EOI
import configparser
c = configparser.ConfigParser()
c.read('params.txt')
print c['chassis']['serialNumber']
EOI
)

echo $serialNumber

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