用bash读取.env(带空格的vars)

时间:2019-02-19 06:24:32

标签: bash docker environment-variables

我正在使用nodedock。

它具有一个start.sh脚本来启动docker

#!/usr/bin/env bash

set -e
cd "$( dirname "${BASH_SOURCE[0]}" )"

if [ ! -f .env ]; then
  echo "Having .env is required. Maybe you forgot to copy env-example?"
  exit 1
fi

while read -r line; do
  VARNAME=$(echo ${line} | awk '{sub(/\=.*/,x)}1')

  if [[ -z ${!VARNAME} ]]; then
    declare -x ${line}
  fi
done < <(egrep -v "(^#|^\s|^$)" .env)

docker-compose up -d ${NODEDOCK_SERVICES}
docker-compose logs -t -f ${NODEDOCK_LOG_AFTER_START}

NODEDOCK_SERVICES = nginx node workspace mongo

如果发现如果您需要一个带空格的变量,则必须用双引号"nginx node workspace mongo"

编写环境变量。

问题在于此“ req表达式” VARNAME=$(echo ${line} | awk '{sub(/\=.*/,x)}1')不能与双引号一起使用。

有解决方案吗?

2 个答案:

答案 0 :(得分:1)

问题不是您的time表达式是 ,而是当您调用内置的awk时。声明时请使用正确的引号。

declare

因为没有引号,所以您的作业看起来像

declare -x "$str"

,它在空格处分割,结果字符串的第一个单词分配给declare -x NODEDOCK_SERVICES=nginx node workspace mongo 。但是使用正确的引号,赋值将保持不变,保留结果字符串中的空格。

也就是说,可以通过使NODEDOCK_SERVICES循环以read作为分隔符来解析行来修改整个循环,因此您可以轻松地解析键/值对。在这一点上, 尚不清楚文件中的分配形式为下面的1或2。

=

以下逻辑适用于两种情况

NODEDOCK_SERVICES = nginx node workspace mongo
NODEDOCK_SERVICES=nginx node workspace mongo

作为一种好习惯,除非有充分的理由,否则请始终在shopt -s extglob while IFS== read -r key value; do key=${key%%+([[:space:]])} value=${value##+([[:space:]])} if [[ -z ${!key} ]]; then declare -x "$key=$value" fi done < <(egrep -v "(^#|^\s|^$)" .env) 中引用变量。小写的用户定义变量可帮助您将它们与外壳本身维护的环境变量区分开。

答案 1 :(得分:1)

如果您想从.env文件格式中读取特定变量(可能不完全是您的问题,但可能会帮助其他人,因为您的标题可能会误导您):

read_var() {
    VAR=$(grep "^$1=" $2 | xargs)
    IFS="=" read -ra VAR <<< "$VAR"
    IFS=" "
    echo ${VAR[1]}
}