Shell怎么在yaml文件中生成数组属性

序言

最近在项目中碰到一个需求,在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 

具体实现

实现思路为:

  1. 算出变量IP_ADDR前面空格长度
  2. 循环赋值空格到新变量spacevalue
  3. 将传递的ip字符串转为数组
  4. 循环数组拼接空格和ip生成符合yaml格式ip字符串
  5. 利用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  

你可能感兴趣的:(Shell怎么在yaml文件中生成数组属性)