Eu tenho um arquivo parameters.ini, como:
[parameters.ini]
database_user = user
database_version = 20110611142248
Quero ler e usar a versão do banco de dados especificada no arquivo parameters.ini de dentro de um script de shell bash para que possa processá-lo.
#!/bin/sh
# Need to get database version from parameters.ini file to use in script
php app/console doctrine:migrations:migrate $DATABASE_VERSION
Como eu faria isso?
Respostas:
Que tal fazer um grep para essa linha e depois usar awk
fonte
| tr -d ' '
no final.Você pode usar o analisador nativo bash para interpretar os valores ini, por:
Arquivo de amostra:
Para variáveis de acesso, basta imprimi-los:
echo $var1
. Você também pode usar matrizes conforme mostrado acima (echo ${IPS[@]}
).Se você deseja apenas um único valor, execute o grep:
Para a demonstração, verifique esta gravação em asciinema .
É simples porque você não precisa de nenhuma biblioteca externa para analisar os dados, mas tem algumas desvantagens. Por exemplo:
Se você tiver espaços entre
=
(nome da variável e valor), então você deve cortar os espaços primeiro, por exemploOu se você não se importa com os espaços (inclusive no meio), use:
Para apoiar
;
comentários, substitua-os por#
:As seções não são suportadas (por exemplo, se você tiver
[section-name]
, então você terá que filtrar como mostrado acima, por exemplogrep =
), o mesmo para outros erros inesperados.Se você precisa ler valor específico sob a seção específica, utilização
grep -A
,sed
,awk
ouex
).Por exemplo
Nota: Onde
-A5
está o número de linhas a serem lidas na seção. Substituasource
porcat
para depurar.Se você tiver algum erro de análise, ignore-o adicionando:
2>/dev/null
Veja também:
fonte
source <(grep = <(grep -A5 '\[section-b\]' file.ini))
isso não funcionará para ele: [sec a] a = 1 b = 2 c = 3 [sec b] a = 2 b = 3 [sec c] a = 0. onde não há regra definida com linhassyntax error near unexpected token '('
. Com o bash, ele falha silenciosamente tanto no prompt quanto no script.O Bash não fornece um analisador para esses arquivos. Obviamente, você pode usar um comando awk ou algumas chamadas sed, mas se você for bash-priest e não quiser usar nenhum outro shell, poderá tentar o seguinte código obscuro:
Uso:
O bash ini-parser pode ser encontrado no blog do The Old School DevOps .
fonte
Sed one-liner, que leva as seções em consideração. Arquivo de exemplo:
Digamos que você queira o param2 da seção2. Execute o seguinte:
Darei à você
fonte
"/^\[section2\]/,/^\[/{...}"
brew install gnu-sed
e, em seguida, utilizargsed
(de outro modo:sed: illegal option -- r
)sed -nr "/^\[SECTION2\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }"
funciona a expressão? obrigadoBasta incluir seu arquivo .ini no corpo do bash:
Arquivo example.ini :
Arquivo example.sh
fonte
Todas as soluções que vi até agora também atingiram as linhas comentadas. Este não fez, se o código do comentário for
;
:fonte
| tr -d ' '
no final.uma das mais soluções possíveis
fonte
Exibir o valor de my_key em um my_file estilo ini :
-n
- não imprime nada por padrão-e
- executa a expressãos/PATTERN//p
- exibir qualquer coisa que siga este padrão no padrão:^
- o padrão começa no início da linha\s
- caractere de espaço em branco*
- zero ou muitos (caracteres de espaço em branco)Exemplo:
Assim:
fonte
bar
impresso), pelo menos no Unix / OSX.sed
Você pode usar
sed
para analisar o arquivo de configuração ini, especialmente quando tiver nomes de seção como:então você pode usar o seguinte
sed
script para analisar os dados acima:isso converterá os dados ini neste formato simples:
então será mais fácil analisar usando
sed
,awk
ouread
tendo nomes de seção em cada linha.Créditos e fonte: arquivos de configuração para scripts de shell , Michael Grünewald
Alternativamente, você pode usar este projeto
chilladx/config-parser
:, um analisador de configuração usandosed
.fonte
Você pode usar a
crudini
ferramenta para obter valores INI, por exemplo:fonte
yum install crudini
Para pessoas (como eu) procurando ler arquivos INI de scripts de shell (leia shell, não bash) - eu criei uma pequena biblioteca auxiliar que tenta fazer exatamente isso:
https://github.com/wallyhall/shini (licença MIT, faça o que quiser. Vinculei acima, incluindo inline, pois o código é bastante extenso).
É um pouco mais "complicado" do que o simples
sed
linhas sugeridas acima - mas funciona em uma base muito semelhante.A função lê um arquivo linha por linha - procurando marcadores de seção (
[section]
) e declarações de chave / valor (key=value
).Em última análise, você obtém um retorno de chamada para sua própria função - seção, chave e valor.
fonte
Semelhante às outras respostas Python, você pode fazer isso usando a
-c
sinalização para executar uma sequência de instruções Python fornecidas na linha de comando:Isso tem a vantagem de exigir apenas a biblioteca padrão do Python e a vantagem de não gravar um arquivo de script separado.
Ou use um documento aqui para melhor legibilidade, desta forma:
fonte
Algumas das respostas não respeitam comentários. Alguns não respeitam as seções. Alguns reconhecem apenas uma sintaxe (apenas ":" ou apenas "="). Algumas respostas Python falham em minha máquina por causa de captialização diferente ou falha ao importar o módulo sys. Todos são um pouco concisos para mim.
Então, eu escrevi o meu próprio e, se você tiver um Python moderno, provavelmente poderá chamá-lo de seu shell Bash. Ele tem a vantagem de seguir algumas das convenções de codificação comuns do Python e até mesmo fornecer mensagens de erro e ajuda sensatas. Para usá-lo, nomeie-o como myconfig.py (NÃO o chame de configparser.py ou ele pode tentar importar a si mesmo), torne-o executável e chame-o como
Este é meu código para Python 3.5 no Linux:
fonte
simplicidade complexa
arquivo ini
test.ini
script bash com leitura e execução
/ bin / parseini
então, em outro script, eu procuro os resultados do comando e posso usar qualquer variável dentro
test.sh
finalmente a partir da linha de comando a saída é, portanto,
fonte
Aqui está minha versão, que analisa seções e preenche uma matriz associativa global g_iniProperties com ela. Observe que isso funciona apenas com bash v4.2 e superior.
E aqui está um código de amostra usando a função acima:
fonte
Este script obterá os parâmetros a seguir:
o que significa que se o seu ini tiver:
por exemplo. como chamá-lo:
[ meio Ambiente ]
[DataBase_Sector]
Então ligando para:
isso irá recuperar o seguinte "algo"
o script "pars_ini.ksh":
fonte
Eu escrevi um script python rápido e fácil para incluir no meu script bash.
Por exemplo, seu arquivo ini é chamado
food.ini
e no arquivo você pode ter algumas seções e algumas linhas:Copie este pequeno script Python de 6 linhas e salve-o como
configparser.py
Agora, em seu script bash, você pode fazer isso, por exemplo.
ou
Isso pressupõe:
Espero que ajude : ¬)
fonte
Minha versão do one-liner
fonte
Acabei de escrever meu próprio analisador. Tentei usar vários analisadores encontrados aqui, nenhum parece funcionar com ksh93 (AIX) e bash (Linux).
É o estilo de programação antigo - análise linha por linha. Muito rápido, pois usa poucos comandos externos. Um pouco mais lento por causa de toda a avaliação necessária para o nome dinâmico do array.
O ini suporta 3 sintaxes especiais:
Usei toda essa sintaxe para obter um arquivo ini bastante complexo e reutilizável. Útil para instalar produtos ao instalar um novo sistema operacional - fazemos muito isso.
Os valores podem ser acessados com $ {ini [$ section. $ Item]}. A matriz DEVE ser definida antes de chamá-la.
Diverta-se. Espero que seja útil para outra pessoa!
fonte
Esta implementação usa
awk
e tem as seguintes vantagens:;
Versão formatada :
One-liner :
fonte
Quando uso uma senha em base64, coloco o separador ":" porque a string de base64 pode ter "=". Por exemplo (eu uso
ksh
):Em
parameters.ini
colocar a linhapass:QWJjMTIzCg==
e, finalmente:Se a linha tiver espaços, como
"pass : QWJjMTIzCg== "
adicionar| tr -d ' '
para cortá-los:fonte
Isso usa o perl do sistema e expressões regulares limpas:
fonte
A resposta de "Karen Gabrielyan" entre outras respostas foi a melhor, mas em alguns ambientes não temos awk, como o típico busybox, mudei a resposta pelo código abaixo.
fonte
Se o Python estiver disponível, o seguinte irá ler todas as seções, chaves e valores e salvá-los em variáveis com seus nomes seguindo o formato "[seção] _ [chave]". Python pode ler arquivos .ini corretamente, então nós fazemos uso dele.
config.ini
fonte
Você pode usar um analisador CSV xsv para analisar dados INI.
ou de um arquivo.
fonte
Se estiver usando seções, isso fará o trabalho:
Exemplo de saída bruta:
Análise regexp:
Agora todos juntos:
fonte
Eu tenho um bom one-liner (supondo que você tenha
php
ejq
instalado):fonte