我创建了一个能够接收诸如“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}
你同时运行该脚本或其他一些脚本多次在同一个文件? –
'cat .envtemp | ... | tee .envtemp'是一种竞赛条件。在'cat'看到任何数据之前,有时tee会截断.envtemp。您需要使用过渡文件(例如,另一个临时文件)。 –
我运行这个脚本一次,但正如您可以在manage_env()函数内部看到的那样,有一个for循环,因此change_value()函数在每个循环中被调用一次,并且它是处理文件的脚本的一部分。 – Leluke