如何导入配置文件变量,但使用不同的分隔符?

How to import a config file variable, but use a different separator?

首先,source. 不起作用,因为我使用的是不同类型的分隔符,类似于。

我已经尝试了几种方法 google,但到目前为止还没有成功。
我设法正确打印出所有变量和值,但我无法将其作为变量存储在此 bash 过程中。

我想要的:

在 bash 过程结束时,我 "echo $HUA_IP:"
根据 config.cf 文件,它应该给我“192.168.0.1”。

文件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:

尝试:

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//\"/}

    这将从输入行中删除所有 double-quotes。

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

    这会将行中的 : 替换为 =,然后使用 declare 创建一个变量。

    -x 选项告诉 bash 导出声明的变量。

  • done <config.cf

    这告诉循环从 config.cf.

  • 获取它的标准输入

如果您更改 if 条件,您的代码即使不是最佳方法也能正常工作。正确的方法是:

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