簡體   English   中英

當執行完全相同的代碼時,awk命令具有不同的行為。 為什么?

[英]awk command has different behaviors when executing the exact same code. Why?

我創建了一個小shellscript,它能夠接收值列表,例如“ MY_VAR_NAME = var_value MY_VAR_NAME2 = value2 ...”,僅用空格分隔。 還應該可以使用諸如MY_VAR_NAME =''或MY_VAR_NAME =之類的值(無)。

這些值然后用於更改環境變量文件中的值,例如,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 $@
    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 $@

    cat .envtemp > .env

    exit 0
}

main $@

這是用於重新創建錯誤的示例腳本。 它不會每次都發生,並且當它發生時,並非總是具有相同的輸入。

#!/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}

您是否嘗試過使用兩個文件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM