Como eu leio um arquivo de propriedades através do meu script?

2

Estou usando o shell bash. Eu estou tentando escrever um script que irá ler um arquivo de propriedades e, em seguida, fazer algumas substituições em outro arquivo com base nos pares de valor-chave que lê no arquivo. Então eu tenho

#!/bin/bash

file = "/tmp/countries.properties"

while IFS='=' read -r key value
do
  echo "${key} ${value}" 
  sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g' /tmp/country.rb
done < "$file"

mas quando eu vou rodar o arquivo, eu recebo um "Nno tal arquivo ou erro de diretório", apesar do fato do meu arquivo existir (eu fiz um "ls" depois para verificá-lo).

localhost:myproject davea$ sh /tmp/script.sh 
=:                         cannot open '=' (No such file or directory)
/tmp/countries.properties: ASCII text
/tmp/script.sh: line 9: : No such file or directory
localhost:myproject davea$ 
localhost:myproject davea$ ls /tmp/countries.properties 
/tmp/countries.properties

O que mais eu preciso fazer para ler com sucesso meu arquivo de propriedades?

    
por Dave 09.03.2017 / 22:41

2 respostas

5

Os erros estão aqui:

=:                         cannot open '=' (No such file or directory)

Algo está tentando abrir um arquivo chamado = , mas não existe.

/tmp/script.sh: line 9: : No such file or directory

Isso geralmente teria o nome do arquivo antes dos últimos dois pontos, mas como está vazio, parece que algo está tentando abrir um arquivo com um nome vazio.

Considere a linha:

file = "/tmp/countries.properties"

Isso executa o comando file com os argumentos = e /tmp/countries.properties . (O shell não importa quais são os argumentos para um comando, pode haver algo que use o sinal de igual como argumento.) Agora, file simplesmente acontece de ser um programa usado para identificar os tipos de arquivos , e faz exatamente isso. Primeiro, tente abrir = , resultando em um erro e, em seguida, abrindo /tmp/countries.properties , informando o que é:

/tmp/countries.properties: ASCII text

O outro No such file or directory vem do redirecionamento < $file . Como a variável não recebe um valor, o redirecionamento não funcionará.

Uma atribuição no shell requer que não haja nenhum espaço em branco ao redor do sinal = , portanto:

file=/tmp/countries.properties

Além disso, aqui:

sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g'

As variáveis não são expandidas entre aspas simples, e você tem aquelas ao redor de todo o segundo argumento, então sed obterá literal ${key} e não o conteúdo da variável.

Encerre as aspas simples para expandir as variáveis ou apenas use aspas duplas para toda a string:

sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g' 
sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g"
    
por 09.03.2017 / 22:59
0

Tente:

file="/tmp/countries.properties"
    
por 09.03.2017 / 22:56