首页 > 解决方案 > 如何导入配置文件变量,但使用不同的分隔符?

问题描述

首先,source并且.由于我使用的是不同类型的分隔符而无法正常工作,类似于。

我已经尝试了几种可以谷歌搜索的方法,但到目前为止没有任何运气。
我设法正确打印出所有变量和值,但我无法在这个 bash 进程中将其存储为变量。

我想要的是:

在 bash 进程结束时,当我“回显 $HUA_IP:”
时,它应该根据 config.cf 文件给我“192.168.0.1”。

文件配置.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:

标签: bashubuntu-16.04

解决方案


尝试:

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

运行此代码时,输​​出为:

192.168.0.1

这个怎么运作

这里的关键是declarebash 内置函数,它允许您使用 bash 变量来创建和分配另一个变量。举个简单的例子:

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

现在,让我们将其应用于您的输入文件:

  • while read -r line; do

    这将启动一个循环,一次读取一行输入。

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

    这将删除输入行中的所有双引号。

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

    这将替换:=in line,然后使用 declare 创建一个变量。

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

  • done <config.cf

    这告诉循环从config.cf.


推荐阅读