Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Arrays Bash参数扩展、间接引用和后台处理_Arrays_Bash_For Loop_Associative Array_Variable Declaration - Fatal编程技术网

Arrays Bash参数扩展、间接引用和后台处理

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

在与此问题斗争了几个小时并在此处搜索,但未能找到匹配的解决方案后,是时候提出以下问题:

在bash(4.3)中,我尝试结合以下几点:

  • 创建一个数组
  • For使用一个不太快的命令遍历数组的值(卷曲到web服务器以获取值),因此我们对每个循环进行后台处理以并行化所有内容以加快速度
  • 将数组中的值的名称设置为通过“读取”命令重定向到数组的值所分配的变量
  • 对每个循环进行背景设置,并将它们的PID放入一个常规数组中,然后将每个PID与关联数组中的相关数组值相关联,这样我就有了PID的数组值名称的key=value对
  • 使用“wait”等待每个PID退出0,或抛出一个错误,告诉我们数组中的哪些值名未能通过引用关联数组退出0
  • 我需要能够导出原始数组中的所有变量名及其现在关联的值(来自curl命令结果),因为我从另一个bash脚本中获取该脚本,该脚本将使用导出的变量/值
我之所以使用“read”而不是“export”加上“export var=$(command)”或类似的命令,是因为当我在下一个for循环中使用“wait”并获取PID时,我实际上(错误地)获取了“export”命令的PID,该命令始终存在0,因此我没有检测到错误。当我使用read和redirect来设置VAR(来自数组中的name)和background的值时,它实际上获得了命令的PID,我用“wait”命令捕获下一个循环中的任何错误

因此,基本上,这似乎大部分是可行的,除非我意识到“read”命令实际上并没有正确地将变量替换为数组名称值,因为重定向命令将其输出发送到该名称,以便将替换的VAR名称设置为值。或者,可能是命令完全错误,因此我没有正确地将命令的结果重定向到试图设置的变量名

值得一提的是,当我手动运行curl | python命令(提取值,然后解析JSON输出)时,它肯定成功了,所以我知道这是可行的,我只是无法获得重定向以将结果输出发送到VAR名称

下面是我尝试做的一个例子: 在父脚本中:

# 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}"