场景
工程中有一个 xxx.properties 的配置文件,里面有些环境变量,如数据库连接,文件目录等
同时有一个处理数据的 shell 脚本,里面也需要这部分环境变量
通常的做法是在写 Dockerfile 时,使用 ENV xx xx
的方式制定
但是,系统环境有多个,dev、test、release 等
不能针对每一个环境都去修改 Dockerfile 文件
于是乎就尝试使用 shell 脚本读取配置文件,将结果设置到环境变量中
步骤
1. 按行读取配置文件
Linux 有多中按行读取文件的方式:awk,cat 等,我这里采用了 cat 的方式
cat /data/luelue.properties | while read line; do
echo $line
done
这样就可以将数据读取出来
2. 修改数据格式
luelue.properties 中的数据格式是
auther:shuai
url:jdbc:mysql://localhost:3306/liquibase?useSSL=false
但是 Linux 环境变量中的数据格式是
export auther=shuai
export url=jdbc:mysql://localhost:3306/liquibase?useSSL=false
因此我们要做的是:
- 切分 luelue.properties 中的数据
- 组装成 export xx=xx 的格式
2.1 切分数据
Linux 有多种切分字符串的方式,这里我采用了 ${string#*chars}
、${string%chars*}
的方式
string 是要截取的字符串
*
是通配符的一种,表示任意长度的字符串chars 是指定的字符(或者子字符串)
%、# 意思是从右向左、从左向右
针对auther:shuai
使用${line%:*}
${line#*:}
就可以截出auther
shuai
但是url:jdbc:mysql://localhost:3306/liquibase?useSSL=false
截出的就是`url:jdbc:mysql://localhost:
url
为什么呢?
因为单个 #、% 意思是:遇到第一个匹配的就停止
那么很显然,截取 Key 的时候,要使用${line%%:*}
2.2 拼装数据
使用:echo export ${line%%:*}"="${line#*:}
生成需要的 Linux 环境变量的格式
2.3 追加到配置文件中
使用:echo xxx >> file
echo export ${line%%:*}"="${line#*:} >> /etc/profile
2.4 健壮性处理
luelue.properties 配置文件中通常有 # 标识的注释,这些注释文字很明显不是我们所需要的
通过:$line != \#*
判断是否是 # 开头
2.5 加载配置文件
最后别忘记 source /etc/profile
是配置文件剩下
字符串判空
Linux 字符串判空操作奇奇怪怪,多种多样,做这个功能的时候看花了眼
通常是使用,但是这种情况判断好使,!= 我测试是无效的。
if [x"$prv" = x]; then
xxx
else
xxx
fi
这里整理出一个简单好用的判断非空的方式
if [-z $prv]; then
xxx
else
xxx
fi