Iterar vários arquivos em uma pasta e atribuir valor

0

Eu tenho uma pasta chamada MyProperties e ela contém vários arquivos .properties como 1.properties , 2.properties , 3.properties e assim por diante. Cada arquivo contém algo como:

keyname=value 

O que devo escrever aqui como o valor no arquivo de propriedades para que seja atribuído ou substituído? Como eu faço uma iteração em um script bash e atribuo o valor à chave?

pseudocódigo:

#!/bin/bash
valuetobepassed="something"
#iterate over each file in the folder and replace/assign value corresponding to keyname
    
por HDev007 25.04.2017 / 13:22

2 respostas

1

Você pode usar sed para substituir valores em arquivos:

#!/bin/bash

new_value=5
for f_name in MyProperties/*.properties; do
     sed -i "s/^keyname=.*$/keyname=$new_value/" "$f_name"
done
    
por 25.04.2017 / 13:44
1

Se você realmente tiver vários arquivos com varName=value pares, tudo o que você precisa fazer é fonte . Portanto, repita todos os arquivos .properties e forneça cada um deles:

for file in /path/to/MyProperties/*.properties; do
    . "$file"
done

Agora você tem todas as variáveis definidas em seu script. Para ilustrar:

$ cat foo.properties 
foo="bar"
$ echo "$foo"  ## no value

$ . ./foo.properties 
$ echo "$foo"
bar

Isso pressupõe que seus arquivos .properties tenham nada além de pares variável = valor . Ao fazer o sourcing, cada linha do arquivo será executada no shell executando o script que faz o sourcing. Assim, todos os comandos em seus arquivos .properties também serão executados. E qualquer invasor com acesso a MyProperties pode adicionar um comando malicioso a ele. Portanto, faça isso apenas se puder ter certeza do conteúdo dos arquivos.

Observe que é importante que o caminho fornecido para o . incorporado contenha um caractere / (daí o ./foo.properties acima), caso contrário, o arquivo será consultado nos diretórios de $PATH em vez do diretório atual (no caso de bash e quando não estiver no modo de conformidade com POSIX, . file procurará file no diretório de trabalho atual se ele não tiver sido encontrado em $PATH ).

    
por 25.04.2017 / 13:42