O fato de você poder fazer algo em bash
não significa que você deva .
sh
(e bash
etc) são mais adequados para serem wrappers relativamente simples para iniciar programas ou em torno de comandos de processamento de texto. Para tarefas mais complicadas, incluindo a análise de arquivos ini e sua atuação, outras linguagens são mais apropriadas. Você já pensou em escrever seu script em perl
ou python
? Ambos têm bons analisadores de arquivo .ini - usei Config::INI
do perl várias vezes quando precisei analisar um arquivo ini.
Mas se você insistir em fazer isso no bash, você deve usar um array associativo ao invés de definir variáveis individuais.
Comece com algo assim:
#! /bin/bash
inifile='user1074170.ini'
# declare $config to be an associative array
declare -A config
while IFS='=' read -r key val ; do
config["$key"]="$val"
done < <(sed -E -e '/^\[/d
s/#.*//
s/[[:blank:]]+$|^[[:blank:]]+//g' "$inifile" )
# now print out the config array
set | grep '^config='
O script sed
exclui a linha [Section1]
(na verdade, todas as linhas que começam com um colchete aberto [
- você vai querer lidar com isso de forma diferente [1] em um arquivo ini com várias seções) e remove comentários, bem como espaços em branco iniciais e finais. O loop while
lê cada linha, usando =
como um delimitador de campo e atribui o conteúdo às variáveis $ key e $ val, que são então adicionadas ao array $ config.
Saída:
config=([value1]="abc\'def" [value3]="mno\$pqr" [value2]="ghi>jkl" [value4]="stu;vwx" )
Você pode usar as entradas da matriz mais tarde no seu script da seguinte forma:
$ echo value1 is "${config[value1]}"
value1 is abc'def
$ [ "${config[value4]}" = 'stu;vwx' ] && echo true
true
[1] awk
ou perl
tem maneiras fáceis e convenientes de ler arquivos no modo "parágrafo". Um parágrafo sendo definido como um bloco de texto separado de outros blocos de texto por uma ou mais linhas em branco.
por exemplo. para trabalhar somente com [Section1]
, insira o script awk
abaixo imediatamente antes do script sed
ser alimentado no loop while
acima:
awk -v RS= -v ORS='\n\n' '/\[Section1\]/' "$inifile" | sed ...
(e remova "$inifile"
do final da linha de comando sed
, é claro - você não quer alimentar o arquivo novamente depois de ter tido o trabalho de extrair apenas [Section1]
dele ).
A configuração de ORS
não é estritamente necessária se você estiver extraindo apenas uma seção do arquivo ini - mas será útil manter a separação de parágrafos se você estiver extraindo duas ou mais seções.