gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:20:17 25 4
gpt4 key购买 nike

我正在使用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')不适用于双引号。

有什么办法吗?

最佳答案

问题不在于您的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)

好的做法是,始终用 bash引用变量,除非您有很好的理由不这样做。小写的用户定义变量可帮助您将它们与 shell 本身维护的环境变量区分开。

关于bash - 用bash读取.env(带空格的vars),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54759987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com