从循环内部构造命令不会呈现“ =”符号

时间:2019-05-10 04:24:44

标签: bash

我正在尝试从.env文件中读取脚本,并在我从中调用该脚本的会话中导出环境变量。

这是我的.env文件:

# Some comment here
NODE_ENV=development
JWKS_AUDIENCE=test test02

以及从该文件读取的我的bash脚本:

set-local-env.sh

IFS='=' # delimiter
while read LINE
    do 
        if [[ $LINE =~ ^\#.* ]] ;
        then
            continue
        fi
        read -ra ADDR <<< "$LINE"
        export ${ADDR[0]}=\"${ADDR[1]}\"
done < .env.development

export myvar="sup"

我通过使用source来设置运行它的会话的环境来运行它:

$ source ./set-local-env.sh
-bash: export: `"development "': not a valid identifier
-bash: export: `"test test02"': not a valid identifier

底部myvar="sup"处的最后一个导出正在工作:

$ echo $myvar
sup

我的猜测是该命令的构造不正确,我从export ${ADDR[0]}=\"${ADDR[1]}\"中得到的是:

  • export NODE_ENV="development"
  • export JWKS_AUDIENCE="test test02"

我尝试回显export命令(即echo export ${ADDR[0]}=\"${ADDR[1]}\"),这就是我得到的:

export NODE_ENV "development"
export JWKS_AUDIENCE "test test02"
export myvar=sup

从循环内部生成的两个exports没有等号。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您不需要这个:

read -ra ADDR <<< "$LINE"
export ${ADDR[0]}=\"${ADDR[1]}\"

这:

IFS='='

只需执行以下操作,您就可以开始了:

export "$LINE"

答案 1 :(得分:0)

为什么不仅仅正常地获取变量,然后仅按名称导出变量?

. file.env
while IFS=\= read foo bar; do
  [[ ! "$foo" =~ ^\# ]] && export $foo
done < file.env