我的环境是
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
....
我该怎么办?谢谢您的任何建议。
答案 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
仔细检查一下,如果还有其他问题,请告诉我。