Нужен скрипт оболочки bash для чтения пар имя-значение из файла - PullRequest
14 голосов
/ 14 февраля 2011

У меня есть файл типа

name1=value1
name2=value2

Мне нужно прочитать этот файл, используя скрипт оболочки и установить переменные

$name1=value1
$name2=value2

Пожалуйста, предоставьте сценарий, который может сделать это.

Я попробовал первый ответ ниже, то есть поиск файла свойств, но у меня возникает проблема, если значение содержит пробелы. Это интерпретируется как новая команда после пробела. Как я могу заставить его работать при наличии пробелов?

Ответы [ 7 ]

19 голосов
/ 14 февраля 2011

Если все строки во входном файле имеют этот формат, то при простом поиске в нем будут установлены переменные:

source nameOfFileWithKeyValuePairs

или

. nameOfFileWithKeyValuePairs
11 голосов
/ 14 февраля 2011

Использование:

while read -r line; do declare  "$line"; done <file
10 голосов
/ 05 сентября 2014

Извлечение файла с помощью . или source имеет проблему, заключающуюся в том, что вы также можете помещать туда команды, которые выполняются.Если ввод не является абсолютно надежным, это проблема (привет rm -rf /).

Вы можете использовать read для чтения пар ключ-значение, например, если существует только ограниченное известное количество ключей:

read_properties()
{
  file="$1"
  while IFS="=" read -r key value; do
    case "$key" in
      "name1") name1="$value" ;;
      "name2") name2="$value" ;;
    esac
  done < "$file"
}
5 голосов
/ 13 января 2015

Улучшенная версия @ robinst

read_properties()
{
  file="$1"
  while IFS="=" read -r key value; do
    case "$key" in
      '#'*) ;;
      *)
        eval "$key=\"$value\""
    esac
  done < "$file"
}

Изменения:

  • Отображение динамического ключа вместо статического
  • Поддерживает (пропускает) строки комментариев

Хорошим решением является также @kurumi, но он не поддерживается в busybox

А тут совершенно другой вариант:

eval "`sed -r -e "s/'/'\\"'\\"'/g" -e "s/^(.+)=(.+)\$/\1='\2'/" $filename`"

(я старался изо всех сил сбежать, но я не уверен, что этого достаточно)

4 голосов
/ 14 февраля 2011

предположим, что имя вашего файла some.properties

#!/bin/sh
# Sample shell script to read and act on properties

# source the properties:
. some.properties

# Then reference then:
echo "name1 is $name1 and name2 is $name2"
2 голосов
/ 05 сентября 2018

, если ваше местоположение файла /location/to/file и ключ mykey:

grep mykey $"/location/to/file" | awk -F= '{print $2}'
0 голосов
/ 14 февраля 2011

sed 's/^/\$/' yourfilename

...