for带有模式的循环环境,并输出自定义结果

时间:2018-07-14 00:31:33

标签: bash

我的环境是

service1=1
service2=a
service3=dd
......
servicen=xx

我搜索了很多资源,并尝试写入文件 test.text

$(
    services=$(compgen -A variable | grep service)
   echo $services | while read -r line ; do
        echo $line="$line" 
    done
    )

然后我执行commid

eval "cat <<EOF
$(<test.text)
EOF
" | tee config.yaml 2> /dev/null

我认为$ services可能是数组类型,并且应该输出echo $ fname =“ $ fname”

service1=1
service2=a
....

但结果是

service1 service2 service3=service1 service2 service3

如何获取env服务器*前缀以及循环输出

server1=1
server2=a
....

我该怎么办?谢谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

如果仍然卡住,则使用命令替换 services=$(compgen -A variable | grep service)时遇到的问题是,它将创建一个包含service1 service2 service3...的长字符串。虽然您可以通过常规的单词拆分来解析它,但最好将所需的环境变量存储在索引数组中,例如

services=( $(compgen -A variable | grep 'service' | grep -v 'services') )

((grep -v 'services'必须从调用services之前声明的列表中删除compgen

现在,您可以使用 indirection 和计数器变量简单地遍历数组,以生成所需的serverX=val输出,例如

declare -i n=1
for i in ${services[@]}; do
    printf "%s=%s\n" "server$((n++))" "${!i}"
done

将其完全放在一个简短的示例中,您可以执行以下操作:

#!/bin/bash

service1=1
service2=a
service3=dd

## fill services with all variable containing "service", excluding "services"
services=( $(compgen -A variable | grep 'service' | grep -v 'services') )

declare -i n=1
for i in ${services[@]}; do
    printf "%s=%s\n" "server$((n++))" "${!i}"  ## use indirection to get value of i
done

使用/输出示例

$ bash compgen_tst.sh
server1=1
server2=a
server3=dd

仔细检查一下,如果还有其他问题,请告诉我。