Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 对于具有模式的循环环境,并输出自定义结果_Bash - Fatal编程技术网

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