场景

工程中有一个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

哒哒队长
7 声望4 粉丝