我正在尝试从.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
没有等号。为什么会发生这种情况,我该如何解决?
答案 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