首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌套for循环通过bash数组控制迭代

使用嵌套for循环通过bash数组控制迭代
EN

Stack Overflow用户
提问于 2022-04-19 23:09:36
回答 2查看 144关注 0票数 1

common.yml文件

代码语言:javascript
复制
tomcat9_version:               "9.0.64-154"
openjdk11_version:                "11.54.24-95"
newrelic_infra_agent_version:  "0.1.22-42"

vars.yml

代码语言:javascript
复制
Tomcat:
  packages:
    OpenJDK11:
      - 11.52.24
    Tomcat9:
      - 9.0.50
   newrelic_infra:
      - 0.1.21

从tomcat9_version、openjdk11_version、newrelic_infra_agent_version中捕获值,并在vars.yml中替换OpenJDK11、Tomcat9、newrelic_infra值

我写的

代码语言:javascript
复制
#!/bin/bash
declare -a arr=("openjdk11_version" "tomcat9_version" "newrelic_infra_agent_version")
declare -a brr=("OpenJDK11:" "Tomcat9:" "newrelic_infra:")
for i in "${arr[@]}"
do
   value=$(grep "$i" common.yaml  | awk '{print $NF}')
   echo "$value"
    for i in "${brr[@]}"
    do
      pakru=$(awk -v var=$i '$1 == "-"{ if (key == var) print $NF;next } {key=$1}' vars.yaml)
      echo "$pakru"
      sed -i "s/$pakru/$value/g" "vars.yaml"
      break
   done
done

我得到的输出

代码语言:javascript
复制
"11.54.24-95"
11.52.24
9.0.50
0.1.21
"9.0.64-154"
11.52.24
9.0.50
0.1.21
"0.1.22-42"
11.52.24
9.0.50
0.1.21

预期产出:-

代码语言:javascript
复制
"11.54.24-95"
11.52.24
"9.0.64-154"
9.0.50
"0.1.22-42"
0.1.21
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-19 23:54:34

使用像yq这样的专用工具可以帮助使用shell处理YAML:

代码语言:javascript
复制
yq eval-all '
    select(fi == 0) as $common |
    select(fi == 1) |                                
    .Tomcat.packages.OpenJDK11[0] = $common.openjdk11_version |
    .Tomcat.packages.Tomcat9[0] = $common.tomcat9_version |
    .Tomcat.packages.newrelic_infra[0] = $common.newrelic_infra_agent_version
' common.yml vars.yml
代码语言:javascript
复制
Tomcat:
  packages:
    OpenJDK11:
      - "11.54.24-95"
    Tomcat9:
      - "9.0.64-154"
    newrelic_infra:
      - "0.1.22-42"
票数 0
EN

Stack Overflow用户

发布于 2022-04-20 00:12:32

弄明白了

代码语言:javascript
复制
#!/bin/bash
declare -a arr=("openjdk11_version" "tomcat9_version" "newrelic_infra_agent_version")
declare -a brr=("OpenJDK11:" "Tomcat9:" "newrelic_infra:")
for ((i=0; i<${#arr[@]}; i++))
do
   value=$(egrep "${arr[$i]}" common.yaml  | awk '{print $NF}' | uniq | cut -d '-' -f1 | tr -d '"')
   echo "$value"
   pakru=$(awk -v var=${brr[$i]} '$1 == "-"{ if (key == var) print $NF;next } {key=$1}' vars.yaml)
   echo "$pakru"
   sed -i "s/$pakru/$value/g" "vars.yaml"
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71932316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档