2017-10-04 61 views
0

我创建了一个能够接收诸如“MY_VAR_NAME = var_value MY_VAR_NAME2 = value2 ...”之类的值列表的小shell脚本,仅由空格分隔。还应该有可能使用诸如MY_VAR_NAME =''或MY_VAR_NAME =(无)等值。执行完全相同的代码时,awk命令具有不同的行为。为什么?

这些值用于更改环境变量文件中的值,例如,MY_VAR_NAME = var_value会使脚本将.env文件中的MY_VAR_NAME值更改为var_value,而不更改文件的其他任何内容。

的ENV文件中有如下配置:

NODE_ENV=development 
APP_PATH=/media 
BASE_URL=http://localhost:3000 
ASSETS_PATH=http://localhost:3000 
USE_CDN=false 
APP_PORT=3000 
WEBPACK_PORT=8080 
IS_CONNECTED_TO_BACKEND=false 
SHOULD_BUILD=false 
USE_REDUX_TOOL=false 
USE_LOG_OUTPUT_AS_JSON=false 
ACCESS_KEY_ID= 
SECRET_ACCESS_KEY= 
BUCKET_NAME= 
BASE_PATH= 
MIX_PANEL_KEY= 
RDSTATION_KEY= 
RESOURCE_KEY= 
SHOULD_ENABLE_INTERCOM=false 
SHOULD_ENABLE_GTM=false 
SHOULD_ENABLE_UTA=false 
SHOULD_ENABLE_WOOTRIC=false 

我已经调试我的剧本,并发现这就是它也有一个问题

cat .envtemp | awk -v var_value="$VAR_VALUE" \ 
        -v var_name="$VAR_NAME" \ 
        -F '=' '$0 !~ var_name {print $0} $0 ~ var_name {print $1"="var_value}' | tee .envtemp 

这段代码点有时输出到.envtemp正确的结果,有时它只是输出什么,使得.envtemp空

我使用的完整代码如下:

function change_value(){ 
    VAR_NAME=$1 
    VAR_VALUE=$2 

    cat .envtemp | awk -v var_value="$VAR_VALUE" \ 
        -v var_name="$VAR_NAME" \ 
        -F '=' '$0 !~ var_name {print $0} $0 ~ var_name {print $1"="var_value}' | tee .envtemp 

    ls -l -a .env* 
} 

function manage_env(){ 
    for VAR in [email protected] 
    do 
     var_name=`echo $VAR | awk -F '=' '{print $1}'` 
     var_value=`echo $VAR | awk -F '=' '{print $2}'` 
     change_value $var_name $var_value 
    done 
} 

function main(){ 
    manage_env [email protected] 

    cat .envtemp > .env 

    exit 0 
} 

main [email protected] 

以下是重新创建错误的示例脚本。它不会每次都发生,而当它发生时,它并不总是具有相同的输入。

#!/bin/bash 
ENV_MANAGER_INPUT="NODE_ENV=production BASE_URL=http://qa.arquivei.com.br ASSETS_PATH=https://d4m6agb781hapn.cloudfront.net USE_CDN=true WEBPACK_PORT= IS_CONNECTED_TO_BACKEND=true ACCESS_KEY_ID= SECRET_ACCESS_KEY= BUCKET_NAME=frontend-assets-dev BASE_PATH=qa" 
cp .env.dist .env 

#Removes comment lines. The script needs a .envtemp file. 
cat .env.dist | grep -v '#' | grep -v '^$' > .envtemp 

./jenkins_env_manager.sh ${ENV_MANAGER_INPUT} 
+0

你同时运行该脚本或其他一些脚本多次在同一个文件? –

+0

'cat .envtemp | ... | tee .envtemp'是一种竞赛条件。在'cat'看到任何数据之前,有时tee会截断.envtemp。您需要使用过渡文件(例如,另一个临时文件)。 –

+0

我运行这个脚本一次,但正如您可以在manage_env()函数内部看到的那样,有一个for循环,因此change_value()函数在每个循环中被调用一次,并且它是处理文件的脚本的一部分。 – Leluke

回答

0

您是否尝试过使用两个文件:

mv .envtemp .envtemp.tmp 
cat .envtemp.tmp | awk ... | tee .envtemp 
+0

正如Wlliam Pursel所说,“cat .envtemp | ... | tee .envtemp是一种竞争条件,有时tee会在cat看到任何数据之前截断.envtemp,您需要使用一个过渡文件(例如另一个临时文件) “。 您的简单解决方案解决了所有问题,感谢所有人的帮助,这让我感到非常紧张。 – Leluke

相关问题