在 bash 中使用声明性数组从文件中分配数组中的特定值

Assigning specific values in array from file using declarative array in bash

假设我有以下名为“test”的文件

其中包含:

[a1b2c3]=test1.xyz
[d4e5f6]=test2.xyz
[g7h8i9]=test3.xyz
...

大约有 30 行。我想分配

a1b2c3
d4e5f6
g7h8i9

放入一个名为 array 的数组,我该怎么做?

with bash 3.1 这将是我的尝试

declare -a array
while read -r line;
do
    array+=("$(echo "$line")")
done < test

但似乎我需要将我的 bash 升级到 4 或 5 以用于声明性数组。所以问题是,我如何单独单独获取每行括号内的值以分配为数组中的不同元素 array

此数组值将在 curl 脚本中使用,该脚本应生成一个文件,其中包含与其关联的值的名称。

for i in "${array[@]}"
    do
    curl -X GET "https://api.cloudflare.com/client/v4/zones/$i/dns_records?" \
        -H "X-Auth-Email: $X-Auth-Email" \
        -H "X-Auth-Key: X-Auth-Key" \
        -H "Content-Type: application/json" \
        -o "${array[@]}.txt"
    done

所以预期 curl -X GET "https://api.cloudflare.com/client/v4/zones/a1b2c3/dns_records? 将是 运行,并且将生成一个名为 test1.xyz.txt 的输出文件,其中包含所述 link 的 dns 记录。下一行和 test2.xyz.txt 等等。

假设括号内的字符串由字母数字组成 字符,请你试试:

#!/bin/bash

while IFS== read -r name val; do
    name=${name#[}                      # remove left square bracket
    name=${name%]}                      # remove right square bracket
    printf -v "var_$name" %s "$val"     # assign e.g. var_a1b2c3 to test1.xyz
done < test

for var in "${!var_@}"; do
    name=${var#var_}                    # retrieve e.g. a1b2c3 by removing var_
    curl -X GET "https://api.cloudflare.com/client/v4/zones/$name/dns_records?" \
    -H "X-Auth-Email: $X-Auth-Email" \
    -H "X-Auth-Key: X-Auth-Key" \
    -H "Content-Type: application/json" \
    -o "${!var}.txt"
done
  • 作为间接变量赋值,printf -v varname value 有效。
  • 作为间接变量引用,"${!var_@}"被展开 到以 var_.
  • 开头的变量名称列表
  • ${!var}指的是变量名用“$var”表示的值。

使用 bash-3.2.57 测试。希望它能与 bash-3.1.

互操作