Shell 脚本针对 1 个参数(共 3 个)重复命令 3 次

问题描述 投票:0回答:1

我在 gitlab ci 管道中使用 shell 脚本来根据分支的上下文更新 .env 变量。总体而言,它按预期工作,只是 3 个变量中的 1 个重复了 3 次。

这是来自管道的调用:

- chmod +x manage_back_env.sh
    - source manage_back_env.sh "$MONGO_DB_URI" "$MONGO_DB_NAME" "$APP_HOST"

这是脚本:

#!/bin/sh

update_env() {
    local key="$1"
    local value="$2"
    local env_file="$3"

    sed -i "s|^$key=.*|$key=$value|g" "$env_file"
}

update_env "MONGO_DB_URI" "$MONGO_DB_URI" "config.env"
update_env "MONGO_DB_NAME" "$MONGO_DB_NAME" "config.env"
update_env "APP_HOST" "$APP_HOST" "config.env"

(我在没有该函数的情况下尝试过此操作,使其非常基本,并一次更新文件 1 变量,但这会产生相同的结果)。

.env 文件具有用于本地开发的值 -

MONGO_DB_URI: "value for the URI"
MONGO_DB_NAME: "nameOfTheSpecificDB"
APP_HOST: "[email protected]"

当以下脚本在 gitlab ci 管道中运行时,我最终得到:

MONGO_DB_URI: "new value for the URI"MONGO_DB_URI: "new value for the URI"MONGO_DB_URI: "new value for the URI"
MONGO_DB_NAME: "newNameOfTheDB"
APP_HOST: "[email protected]"

我对使用此类脚本只有最基本的了解,但在网上找不到任何明确的方向,也无法弄清楚为什么只有 1 值重复 3 次,而其他值却按预期完成。我在作业阶段开始时定义变量,并已验证(多次)存储库上的 config.env 文件仅写入一次 MONGO_DB_URI 变量。

任何指导表示赞赏。谢谢

更新 我添加了一些日志记录,我认为问题源于 mongo uri 字符串中的“=”。当记录键的当前值时,我得到:

Current value of MONGO_DB_URI in config.env: "mongodb+srv://user:[email protected]/?retryWrites

在其切断位置和初始字符串中有一个“=”(MONGO_DB_URI="mongodb+srv://user:[email protected]/?retryWrites=true&w=majority")。但是,我还注意到 URI 值重复发生在同一位置,但每次重复都会有更长的 uri 字符串部分。

shell gitlab-ci sh
1个回答
0
投票

所以我没有得到关于问题发生原因的明确答案。我调整了代码几次,删除了 g 命令以防影响它,但无论如何我仍然继续得到 MONGO_DB_URI 变量的重复。为了继续前进,我切换到使用 awk 的 bash 脚本,而不是使用 sed 的 shell 脚本,这已按预期工作:

#!/bin/bash


update_env() {
    local key="$1"
    local value="$2"
    local env_file="$3"
     
    #set logging of values I'm passing and what is already in file
    echo "Updating $key=\"$value\" in $env_file"

    current_value=$(grep "^$key=" "$env_file" | cut -d '=' -f 2)
    echo "Current value of $key in $env_file: \"$current_value\""

    awk -v key="$key" -v value="$value" -F '=' '
        BEGIN { OFS=FS }
        $1 == key { $2 = "\"" value "\"" }
        { print }
    ' "$env_file" > "$env_file.tmp" && mv "$env_file.tmp" "$env_file"
}

update_env "MONGO_DB_URI" "$MONGO_DB_URI" "config.env"
update_env "MONGO_DB_NAME" "$MONGO_DB_NAME" "config.env"
update_env "APP_HOST" "$APP_HOST" "config.env"
© www.soinside.com 2019 - 2024. All rights reserved.