在 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.
互操作
假设我有以下名为“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.
互操作