Перебрать несколько файлов в папке и присвоить им значение

Перебрать несколько файлов в папке и присвоить им значение

У меня есть папка с именем MyProperties, в которой содержится несколько .propertiesфайлов, например 1.properties, 2.properties, 3.propertiesи т. д. Каждый файл содержит что-то вроде:

keyname=value 

Что мне написать здесь в качестве значения в файле свойств, чтобы оно было назначено или заменено? Как мне перебрать их в скрипте bash и назначить значение ключу?

Псевдокод:

#!/bin/bash
valuetobepassed="something"
#iterate over each file in the folder and replace/assign value corresponding to keyname

решение1

sedДля замены значений в файлах можно использовать :

#!/bin/bash

new_value=5
for f_name in MyProperties/*.properties; do
     sed -i "s/^keyname=.*$/keyname=$new_value/" "$f_name"
done

решение2

Если у вас действительно есть несколько файлов с varName=valueпарами, то все, что вам нужно сделать, этоисточникИтак, перебираем все .propertiesфайлы и выбираем источник для каждого из них:

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

Теперь все ваши переменные определены в вашем скрипте. Для иллюстрации:

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

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

Это предполагает, что ваши .propertiesфайлы имеютничего, кроме пар переменная=значение. При поиске каждая строка файла будет выполнена в оболочке, запускающей скрипт, выполняющий поиск. Таким образом, любые команды в ваших .propertiesфайлах также будут выполнены. И любой злоумышленник, имеющий доступ к , MyPropertiesможет добавить туда вредоносную команду. Поэтому делайте это только в том случае, если вы уверены в содержимом файлов.

Обратите внимание, что важно, чтобы путь, указанный для .встроенной функции, содержал /символ (отсюда и ./foo.propertiesвышеизложенное), так как в противном случае файл будет искаться в каталогах $PATHвместо текущего каталога (в случае bashи когда режим соответствия POSIX не используется, . fileпоиск выполняется fileв текущем рабочем каталоге, если он не был найден в $PATH).

Связанный контент