从 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 脚本中,我想实现两个目标
- 创建一个函数,它将标签名称作为输入,return 包含该标签的测试数组
例如:如果输入参数是“lable1”,函数应该return [test1,test3]
: 如果输入参数是 "lable2" ,函数应该 return [test1,test2]
- 创建一个函数,它将 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
我有一个 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 脚本中,我想实现两个目标
- 创建一个函数,它将标签名称作为输入,return 包含该标签的测试数组
例如:如果输入参数是“lable1”,函数应该return [test1,test3] : 如果输入参数是 "lable2" ,函数应该 return [test1,test2]
- 创建一个函数,它将 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