Bash 对于具有模式的循环环境,并输出自定义结果
我的环境是Bash 对于具有模式的循环环境,并输出自定义结果,bash,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
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
但结果是
service1 service2 service3=service1 service2 service3
如何获取env server*前缀和for循环输出
server1=1
server2=a
....
我应该怎么做?谢谢你的建议。如果你仍然被卡住,那么使用命令替换
services=$(compgen-A variable | grep service)
的问题是它创建了一个长字符串,其中包含service1 service2 service3…
。虽然您可以通过正常的分词来解析它,但最好将所需的环境变量存储在索引数组中,例如
services=( $(compgen -A variable | grep 'service' | grep -v 'services') )
(调用compgen
之前声明的grep-v“services”
必须从列表中删除services
)
现在,您可以使用间接寻址和一个计数器变量在数组上循环生成所需的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
仔细检查一下,如果您还有其他问题,请告诉我。您可以直接在
“${!service@}”上循环。
。在我看来,-i
标志只会造成混乱,而好处却很小。这是一个很好的观点,我对像${!services[@]}这样的间接方法有点怀疑。您仍然需要一个循环变量(或旧的
$1`和shift)来保存这些值,但我可以看出这可能更干净。
$ bash compgen_tst.sh
server1=1
server2=a
server3=dd