Arrays Bash参数扩展、间接引用和后台处理
在与此问题斗争了几个小时并在此处搜索,但未能找到匹配的解决方案后,是时候提出以下问题: 在bash(4.3)中,我尝试结合以下几点:Arrays Bash参数扩展、间接引用和后台处理,arrays,bash,for-loop,associative-array,variable-declaration,Arrays,Bash,For Loop,Associative Array,Variable Declaration,在与此问题斗争了几个小时并在此处搜索,但未能找到匹配的解决方案后,是时候提出以下问题: 在bash(4.3)中,我尝试结合以下几点: 创建一个数组 For使用一个不太快的命令遍历数组的值(卷曲到web服务器以获取值),因此我们对每个循环进行后台处理以并行化所有内容以加快速度 将数组中的值的名称设置为通过“读取”命令重定向到数组的值所分配的变量 对每个循环进行背景设置,并将它们的PID放入一个常规数组中,然后将每个PID与关联数组中的相关数组值相关联,这样我就有了PID的数组值名称的key=va
- 创建一个数组
- For使用一个不太快的命令遍历数组的值(卷曲到web服务器以获取值),因此我们对每个循环进行后台处理以并行化所有内容以加快速度
- 将数组中的值的名称设置为通过“读取”命令重定向到数组的值所分配的变量
- 对每个循环进行背景设置,并将它们的PID放入一个常规数组中,然后将每个PID与关联数组中的相关数组值相关联,这样我就有了PID的数组值名称的key=value对
- 使用“wait”等待每个PID退出0,或抛出一个错误,告诉我们数组中的哪些值名未能通过引用关联数组退出0
- 我需要能够导出原始数组中的所有变量名及其现在关联的值(来自curl命令结果),因为我从另一个bash脚本中获取该脚本,该脚本将使用导出的变量/值
# Source the child script that has the functions I need
source functions.sh
# Create the array
VALUES=(
VALUE_A
VALUE_B
VALUE_C
)
# Call the function sourced from the script above, which will use the above defined array
function_getvalues
在子(源代码)脚本中:
函数_getvalues()
{
curl_pids=()
声明-一个值
对于“${VALUES[@]}”中的值,请执行以下操作
读取${Value} 问题是:代码> Read < /C> >在后台运行时,到标准In。考虑这个简化的工作示例,注释如何使它瘫痪:
VALUES=( VALUE_A VALUE_B )
for value in "${VALUES[@]}"; do
read ${value} < <(echo ${RANDOM}) # add "&" and it stops working
done
echo "VALUE_A=${VALUE_A}"
echo "VALUE_B=${VALUE_B}"
此示例使用,但如果您不介意对操作系统的某些依赖性,您可以使用inotifywait
。我尝试添加echo命令以查看变量(从数组循环的变量名称)设置为什么,它们为空。我不确定这是否意味着它们根本没有使用read命令声明(即替换不起作用),或者如果写入的读取重定向中出现错误,无法将命令的输出发送到VAR名称以进行设置。抱歉,python json解析后,curl命令的预期输出是字符串。如果手动运行curl | python,我将获得预期输出,只是没有读取重定向。此外,我使用python而不是jq,因为a)我我只是对python更为熟悉,b)我正在尽量减少依赖性,我们的团队都有python。哦,感谢Bishop,&在有趣的解决方案之外。read失去与标准in的连接完全是有道理的;当我最初考虑使用“export”命令时,我也有同样的担心。我确实有一个wrinkle关于这个解决方案:我们许多运行这个的开发人员都在OS X上,我读到MKTEM在那里的行为不同。有什么见解吗?我当然也可以对此进行研究。是的,MKTEM
存在可移植性问题。要解决这个问题,请参阅示例,我能够测试“MKTEM-d”在两个OS X上的工作方式相同(最新版本)和Linux,至少在我们的开发人员正在使用的系统上,这对我来说足够好和可移植。太好了。如果这个答案解决了问题,请接受并投票。欢迎使用so!我成功地将我的函数转换为使用temp文件,如前所述,它工作得非常好。谢谢!
VALUES=( VALUE_A VALUE_B )
for value in "${VALUES[@]}"; do
read ${value} < <(echo ${RANDOM}) # add "&" and it stops working
done
echo "VALUE_A=${VALUE_A}"
echo "VALUE_B=${VALUE_B}"
tmpdir=$(mktemp -d)
VALUES=( VALUE_A VALUE_B )
for value in "${VALUES[@]}"; do
(sleep 1; echo ${RANDOM} > "${tmpdir}"/"${value}") &
done
for value in "${VALUES[@]}"; do
wait_file "${tmpdir}"/"${value}" && {
read -r ${value} < "${tmpdir}"/"${value}";
}
done
echo "VALUE_A=${VALUE_A}"
echo "VALUE_B=${VALUE_B}"
rm -r "${tmpdir}"