鞭尾计:未设置循环中的变量



我是新手,所以原谅我的无知。

当在for循环中分配变量时,在使用鞭尾对话框时永远不会设置新值20。有什么建议吗?

andy="10"
{
    for ((i = 0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
    done
 } | whiptail --gauge "Please wait" 5 50 0 
# }
echo "My val $andy

管道中的命令(即由|分隔的一系列命令)总是在子shell中执行,这意味着每个命令都有自己的可变环境。复合命令(…)中的命令也是如此,但复合命令{…}不是这样,它通常可以用于分组而无需创建子shell。

bashzsh中,您可以使用进程替换而不是管道来解决此问题。例如:

andy="10"
for ((i=0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
done > >(whiptail --gauge "Please wait" 6 50 0) 
echo "My val $andy

>(whiptail ...)将导致创建一个子shell来执行whiptail;整个表达式将被这个子shell的标准输入名称所替换(在linux中,它将是类似/dev/fd/63的东西,但在其他操作系统上它可能是一个FIFO)。> >(...)导致标准输出重定向到子shell的标准输入;第一个>只是一个普通的标准输出重定向。

{}中的语句通常不会在子shell中执行。然而,当你给它添加一个管道(|)时,它们似乎在子shell中执行。

如果您删除到whiptail的管道,您将看到andy的更新值

相关内容

  • 没有找到相关文章

最新更新