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

Parse a value from manifest.yaml file and store it's corresponding block name into an array

我有一个 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 脚本中,我想实现两个目标

  1. 创建一个函数,它将标签名称作为输入,return 包含该标签的测试数组

例如:如果输入参数是“lable1”,函数应该return [test1,test3] : 如果输入参数是 "lable2" ,函数应该 return [test1,test2]

  1. 创建一个函数,它将 testName 作为输入,return 整个块的内容

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

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

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

#!/bin/bash

function search {

    searcha=
    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 )

for ix in ${!result[*]}
do
    printf "%s\n" "${result[$ix]}"
done