Нужна bash оболочка script для чтения пар значений имени из файла

У меня есть файл вроде

name1=value1
name2=value2

Мне нужно прочитать этот файл с помощью оболочки script и установить переменные

$name1=value1
$name2=value2

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

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

Ответ 1

while read -r line; do declare  $line; done <file

Ответ 2

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

source nameOfFileWithKeyValuePairs

или

. nameOfFileWithKeyValuePairs

Ответ 3

При поиске файла с помощью . или 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"
}

Ответ 4

Улучшенная версия @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`"

(я старался делать все, чтобы ускользнуть, но я не уверен, что это достаточно)

Ответ 5

Предположим, что имя вашего файла 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"

Ответ 6

sed 's/^/\$/' yourfilename