序言
最近在项目中碰到一个需求,在yaml文件中有一个属性值是ip数组,但是不知道有几个元素,因此属性值只能用一个变量占位,然后根据传递的ip字符串替换变量生成属性值。
因为对shell命令不太熟,想了好久才想出这么个笨方法,特此记录一下。
实现
yaml文件效果所示
[root@docker clay]# cat test.yaml
node:
price: 100
name:
size:
ipAddr:
- 192.168.10.10
- 192.168.10.11
- 192.168.10.12
yaml模版
由于不知道ipAddr下面数组有几个值,因此用变量IP_ADDR代替
[root@docker clay]# cat test.yaml
node:
price: 100
name:
size:
ipAddr:
IP_ADDR
具体实现
实现思路为:
- 算出变量
IP_ADDR前面空格长度 - 循环赋值空格到新变量
spacevalue - 将传递的ip字符串转为数组
- 循环数组拼接空格和ip生成符合yaml格式ip字符串
- 利用sed命令替换yaml文件中的变量
[root@docker clay]# cat test.sh
replace_work_node(){
space=`cat $1 |grep -w $2| awk -F $2 '{print length($1)}'`
i=1
spacevalue=""
while [[ $i -le $space ]]
do
spacevalue="$spacevalue "
let i+=1
done
replacevalue="- "
work_node_array=(`echo $3|tr ',' ' '`)
k=1
length=${#work_node_array[@]}
for w in ${work_node_array[@]}
do
if [ $k -lt $length ]; then
replacevalue="$replacevalue$w\n$spacevalue- "
else
replacevalue="$replacevalue$w"
fi
let k++
done
value="$replacevalue"
sed -i "s%$2%$value%g" $1
}
node=192.168.10.10,192.168.10.11,192.168.10.12
replace_work_node test.yaml IP_ADDR $node
验证
[root@pinyoyougou-docker clay]# cat test.yaml
node:
price: 100
name:
size:
ipAddr:
- 192.168.10.10
- 192.168.10.11
- 192.168.10.12