Saya memiliki file parameter.ini, seperti:
[parameters.ini]
database_user = user
database_version = 20110611142248
Saya ingin membaca dan menggunakan versi database yang ditentukan dalam file parameter.ini dari dalam skrip bash shell sehingga saya dapat memprosesnya.
#!/bin/sh
# Need to get database version from parameters.ini file to use in script
php app/console doctrine:migrations:migrate $DATABASE_VERSION
Bagaimana saya melakukan ini?
Jawaban:
Bagaimana kalau grep untuk baris itu lalu menggunakan awk
sumber
| tr -d ' '
di bagian akhir.Anda dapat menggunakan bash native parser untuk menafsirkan nilai ini, dengan:
File contoh:
Untuk variabel akses, Anda hanya mencetak mereka:
echo $var1
. Anda juga dapat menggunakan array seperti yang ditunjukkan di atas (echo ${IPS[@]}
).Jika Anda hanya ingin satu nilai, grep saja:
Untuk demo, periksa rekaman ini di asciinema .
Ini sederhana karena Anda tidak memerlukan pustaka eksternal apa pun untuk mengurai data, tetapi ia memiliki beberapa kelemahan. Sebagai contoh:
Jika Anda memiliki spasi di antara
=
(nama dan nilai variabel), maka Anda harus memotong spasi terlebih dahulu, misalnyaAtau jika Anda tidak peduli dengan ruang (termasuk di tengah), gunakan:
Untuk mendukung
;
komentar, gantilah dengan#
:Bagian tidak didukung (mis. Jika Anda pernah
[section-name]
, maka Anda harus memfilternya seperti yang ditunjukkan di atas, misgrep =
), sama untuk kesalahan tak terduga lainnya.Jika Anda perlu membaca nilai tertentu di bawah bagian tertentu, penggunaan
grep -A
,sed
,awk
atauex
).Misalnya
Catatan: Di mana
-A5
jumlah baris untuk dibaca di bagian tersebut. Gantisource
dengancat
untuk debug.Jika Anda mendapatkan kesalahan penguraian, abaikan dengan menambahkan:
2>/dev/null
Lihat juga:
sumber
source <(grep = <(grep -A5 '\[section-b\]' file.ini))
ini tidak akan berhasil untuk itu: [sec a] a = 1 b = 2 c = 3 [sec b] a = 2 b = 3 [sec c] a = 0. di mana tidak ada aturan yang pasti dengan garissyntax error near unexpected token '('
. Dengan bash, itu diam-diam gagal baik dari prompt maupun skrip.Bash tidak menyediakan parser untuk file-file ini. Jelas Anda dapat menggunakan perintah awk atau beberapa panggilan sed, tetapi jika Anda bash-priest dan tidak ingin menggunakan shell lain, maka Anda dapat mencoba kode tidak jelas berikut:
Pemakaian:
Bash ini-parser dapat ditemukan di situs blog The Old School DevOps .
sumber
Sed one-liner, yang memperhitungkan beberapa bagian. File contoh:
Katakanlah Anda menginginkan param2 dari bagian2. Jalankan perintah berikut:
akan memberimu
sumber
"/^\[section2\]/,/^\[/{...}"
brew install gnu-sed
dan kemudian menggunakangsed
(sebaliknya:sed: illegal option -- r
)sed -nr "/^\[SECTION2\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }"
ekspresi itu bekerja? terima kasihCukup sertakan file .ini Anda ke dalam bash body:
File example.ini :
File example.sh
sumber
Semua solusi yang saya lihat sejauh ini juga sesuai dengan baris komentar. Yang ini tidak, jika kode komentarnya adalah
;
:sumber
| tr -d ' '
di bagian akhir.salah satu solusi yang lebih mungkin
sumber
Tampilkan nilai my_key dalam my_file gaya ini :
-n
- jangan mencetak apa pun secara default-e
- jalankan ekspresinyas/PATTERN//p
- tampilkan apa pun yang mengikuti pola ini Dalam pola:^
- pola dimulai di awal baris\s
- karakter spasi*
- nol atau banyak (karakter spasi)Contoh:
Begitu:
sumber
bar
dicetak), setidaknya di Unix / OSX.sed
Anda dapat menggunakan
sed
untuk mengurai file konfigurasi ini, terutama jika Anda memiliki nama bagian seperti:sehingga Anda dapat menggunakan
sed
skrip berikut untuk mengurai data di atas:ini akan mengubah data ini menjadi format datar ini:
sehingga akan lebih mudah untuk mengurai menggunakan
sed
,awk
atauread
dengan memiliki nama bagian di setiap baris.Kredit & sumber: File konfigurasi untuk skrip shell , Michael Grünewald
Atau, Anda dapat menggunakan proyek ini
chilladx/config-parser
:, parser konfigurasi menggunakansed
.sumber
Anda dapat menggunakan
crudini
alat untuk mendapatkan nilai ini, misalnya:sumber
yum install crudini
Untuk orang-orang (seperti saya) yang ingin membaca file INI dari skrip shell (baca shell, bukan bash) - Saya telah membuat pustaka pembantu kecil yang mencoba melakukan hal itu:
https://github.com/wallyhall/shini (Lisensi MIT, lakukan sesuka Anda. Saya telah menautkan di atas termasuk inline karena kodenya cukup panjang.)
Ini agak lebih "rumit" daripada
sed
baris sederhana yang disarankan di atas - tetapi bekerja dengan dasar yang sangat mirip.Fungsi membaca dalam file baris demi baris - mencari penanda bagian (
[section]
) dan kunci / nilai deklarasi (key=value
).Pada akhirnya Anda mendapatkan panggilan balik ke fungsi Anda sendiri - bagian, kunci, dan nilai.
sumber
Mirip dengan jawaban Python lainnya, Anda dapat melakukan ini menggunakan
-c
bendera untuk menjalankan urutan pernyataan Python yang diberikan pada baris perintah:Ini memiliki keuntungan karena hanya membutuhkan pustaka standar Python dan keuntungan tidak menulis file skrip terpisah.
Atau gunakan dokumen di sini agar lebih mudah dibaca, dengan demikian:
sumber
Beberapa jawaban tidak menghargai komentar. Beberapa tidak menghormati bagian. Beberapa hanya mengenali satu sintaks (hanya ":" atau hanya "="). Beberapa jawaban Python gagal di mesin saya karena perbedaan huruf kapital atau gagal mengimpor modul sys. Semuanya agak terlalu singkat bagi saya.
Jadi saya menulis sendiri, dan jika Anda memiliki Python modern, Anda mungkin dapat memanggil ini dari shell Bash Anda. Ini memiliki keuntungan karena mengikuti beberapa konvensi pengkodean Python umum, dan bahkan menyediakan pesan kesalahan yang masuk akal dan bantuan. Untuk menggunakannya, beri nama seperti myconfig.py (JANGAN menyebutnya configparser.py atau mungkin mencoba mengimpor sendiri,) membuatnya dapat dieksekusi, dan menyebutnya seperti
Ini kode saya untuk Python 3.5 di Linux:
sumber
kesederhanaan yang kompleks
file ini
test.ini
bash script dengan membaca dan mengeksekusi
/ bin / parseini
kemudian di skrip lain saya mencari hasil dari perintah dan dapat menggunakan variabel apa pun di dalamnya
test.sh
akhirnya dari baris perintah hasilnya adalah demikian
sumber
Ini adalah versi saya, yang mem-parsing bagian dan mengisi array asosiatif global g_iniProperties dengannya. Perhatikan bahwa ini hanya berfungsi dengan bash v4.2 dan yang lebih tinggi.
Dan berikut ini contoh kode menggunakan fungsi di atas:
sumber
Script ini akan mendapatkan parameter sebagai berikut:
Artinya jika ini Anda memiliki:
misalnya. bagaimana menyebutnya:
[ lingkungan Hidup ]
[DataBase_Sector]
Kemudian menelepon:
ini akan mengambil "sesuatu" berikut
skrip "pars_ini.ksh":
sumber
Saya menulis skrip python yang cepat dan mudah untuk disertakan dalam skrip bash saya.
Misalnya, file ini Anda dipanggil
food.ini
dan di dalam file Anda dapat memiliki beberapa bagian dan beberapa baris:Salin skrip Python 6 baris kecil ini dan simpan sebagai file
configparser.py
Sekarang, di skrip bash Anda, Anda dapat melakukan ini misalnya.
atau
Ini mengandaikan:
Semoga membantu : ¬)
sumber
Versi saya dari satu baris
sumber
Baru saja selesai menulis parser saya sendiri. Saya mencoba menggunakan berbagai parser yang ditemukan di sini, sepertinya tidak ada yang berfungsi dengan ksh93 (AIX) dan bash (Linux).
Ini gaya pemrograman lama - mengurai baris demi baris. Cukup cepat karena menggunakan beberapa perintah eksternal. Sedikit lebih lambat karena semua eval yang diperlukan untuk nama dinamis array.
Ini mendukung 3 sintaks khusus:
Saya menggunakan semua sintaks itu untuk memiliki file ini yang cukup kompleks dan dapat digunakan kembali. Berguna untuk menginstal produk saat menginstal OS baru - kami sering melakukannya.
Nilai dapat diakses dengan $ {ini [$ section. $ Item]}. Array HARUS didefinisikan sebelum memanggil ini.
Selamat bersenang-senang. Semoga bermanfaat untuk orang lain!
sumber
Implementasi ini menggunakan
awk
dan memiliki keuntungan sebagai berikut:;
Versi yang diformat :
Satu baris :
sumber
Ketika saya menggunakan kata sandi di base64, saya meletakkan pemisah ":" karena string base64 mungkin memiliki "=". Misalnya (saya gunakan
ksh
):Dalam
parameters.ini
menempatkan barispass:QWJjMTIzCg==
, dan akhirnya:Jika garis memiliki spasi seperti
"pass : QWJjMTIzCg== "
tambahkan| tr -d ' '
untuk memangkasnya:sumber
Ini menggunakan perl sistem dan ekspresi reguler yang bersih:
sumber
Jawaban dari "Karen Gabrielyan" di antara jawaban lainnya adalah yang terbaik tetapi di beberapa lingkungan kami tidak memiliki awk, seperti busybox biasa, saya mengubah jawaban dengan kode di bawah ini.
sumber
Jika Python tersedia, berikut ini akan membaca semua bagian, kunci dan nilai dan menyimpannya dalam variabel dengan nama mereka mengikuti format "[section] _ [key]". Python dapat membaca file .ini dengan baik, jadi kami memanfaatkannya.
config.ini
sumber
Anda dapat menggunakan parser CSV xsv sebagai pengurai data INI.
atau dari file.
sumber
Jika menggunakan bagian, ini akan melakukan pekerjaan:
Contoh keluaran mentah:
Penguraian reguler:
Sekarang semuanya:
sumber
Saya memiliki satu baris yang bagus (mengasumsikan Anda telah
php
danjq
menginstal):sumber