2017-10-04 63 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

相關問題