Как импортировать переменную файла конфигурации, но использовать другой разделитель? - PullRequest
0 голосов
/ 26 июня 2019

Во-первых, source и . не работают, так как я использую разделитель другого типа, что-то вроде.

Я пробовал несколько способов, которые я могу гуглить, но пока что мне не повезло.
Мне удалось правильно распечатать все переменные и значения, но я не могу сохранить их как переменную в этом процессе bash.

Что я хочу:

В конце процесса bash, когда я "echo $ HUA_IP:"
он должен дать мне «192.168.0.1» согласно файлу config.cf.

Файл config.cf:

  "HUA_PASSWORD": "admin",
  "HUA_IP": "192.168.0.1"

Пока мой bash-файл:

#!/bin/bash

configFile="/opt/config.cf"
# config="`cat $configFile`"
# echo $config
# source $configFile
# echo $var1
# conf="";

while read var value
do
    # export "$var"="$value"
    var="${var%:*}"
    var="${var//\"/}"
    var="${var//[\}\{]/}"
    value="${value//\"/}"
    value="${value//,/}"
    # echo "var :'"$var"'"
    # echo "value :'"$value"'"

    if [ !$var = "" ]
    then
        # "$var"="$value"
        # eval $var=$value
        export "$var"="$value"
    fi

done < $configFile

echo $HUA_IP:

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Попробуйте:

while read -r line; do
    line=${line//\"/}
    declare -x "${line/: /=}"
done<config.cf
echo "$HUA_IP"

Когда этот код запускается, вывод:

192.168.0.1

Как это работает

Ключевым моментом здесь является то, что declare, который является встроенным в bash, позволяет использовать переменную bash для создания и назначения другой переменной. В качестве простого примера:

$ x="a=b";  declare -x "$x"; echo "$a"
b

Теперь давайте применим это к вашему входному файлу:

  • while read -r line; do

    Запускает цикл, считывающий по одной строке ввода за раз.

  • line=${line//\"/}

    Удаляет все двойные кавычки из строки ввода.

  • declare -x "${line/: /=}"

    Это заменит : на = в строке, а затем создаст переменную с помощью объявления.

    Опция -x указывает bash экспортировать объявленную переменную.

  • done <config.cf

    Это говорит циклу, чтобы он получал свой стандартный номер от config.cf.

0 голосов
/ 26 июня 2019

Ваш код, даже если он может быть не лучшим подходом, работает, если вы измените свое условие if.Правильный путь:

#...
if [ ! -z $var  ]
then
    # "$var"="$value"
    # eval $var=$value
    export "$var"="$value"
fi
...