shell - 从 manifest.yaml 文件中解析一个值并将其对应的 block 名称存储到一个数组中

标签 shell ubuntu yaml sh app.yaml

我有一个 manifest.yaml 文件

-test1:
    name: test1
    description: this is test1
    label: label1 label2

-test2:
    name: test2
    description: this is test2
    label: label3 label2
    
-test3:
    name: test3
    description: this is test3
    label: label3 label1
    
   

在我的 shell 脚本中,我想实现两个目标
  • 创建一个函数,它将标签名称作为输入并返回包含该标签的测试数组

  • 例如:如果输入参数是 "lable1",函数应该返回 [test1,test3]
    : 如果输入参数是 "lable2",函数应该返回 [test1,test2]
  • 创建一个函数,它将testName作为输入并返回整个 block 的内容

  • 例如:如果输入参数是“test1”,函数应该返回:

    -test1:
        name: test1
        description: this is test1
        label: label1 label2

    最佳答案

    这是一种 bash 的做法。也许您可以改进它或使其更适合您想做的事情。在这个例子中,我们同时执行这两个函数,结果取决于 arg。您可以通过放置自己的正则表达式来修改它。

    #!/bin/bash
    
    function search {
    
        searcha=$1
        if [[ ${searcha}  =~  test ]]; then
            searcht=true #the arg is a test
        else
            searcht=false #the arg is a label
        fi
        
        
        test=""
        name=""
        desc=""
        label=""
        i=0
        while IFS= read -r line
        do
        
        if [[ $i == 0 ]] ; then
            [[ ${line}  =~  ^-.*:$ ]] && test=${line} && i=1 
        elif [[ $i == 1 ]]; then
            [[ ${line}  =~  name: ]] && name=${line} && i=2
        elif [[ $i == 2 ]]; then
            [[ ${line}  =~  description: ]] && desc=${line}  && i=3
        elif [[ $i == 3 ]]; then
            [[ ${line}  =~  label: ]] && label=${line} && i=4
        fi
        
        if [[ $i == 4 ]]; then
            if $searcht; then
            if [[ $test =~ $searcha ]]; then
                echo $test
                echo $name
                echo $desc
                echo $label
                return 0
            fi
            else
            if [[ $label =~ $searcha ]]; then
                echo ${test:1:${#test} -2}
            fi
            fi
            i=0
        fi
        done < manifest.yaml
    }
    
    result=$(search $1)
    
    for ix in ${!result[*]}
    do
        printf "%s\n" "${result[$ix]}"
    done
    

    关于shell - 从 manifest.yaml 文件中解析一个值并将其对应的 block 名称存储到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63423291/

    相关文章:

    Linux bash : find full path of target file when executed via a softlink

    linux - Linux中如何在用户注销时自动运行脚本?

    node.js - 413 请求实体太大 nginx/1.14.0

    python - 在 Django 项目中的 Ubuntu 下创建文件夹并更改文件夹名称

    amazon-web-services - 将 EC2 实例放置在特定子网中时出现 CloudFormation 模板错误

    amazon-web-services - 子网参数不接受列表作为云形成模板 aws 中的输入

    linux - 八进制数字0权限的用途是什么

    C- 收割子进程和背景

    php - 无法在 ubuntu 16.10 上再次安装 php5.6-curl。添加了ppa。

    spring-boot - 在 Spring Boot Web 项目中将 yaml 文件加载到 Map(不是环境配置文件)的最佳方法是什么?