Whiptail Gauge:循环变量未设置

时间:2014-06-20 19:10:22

标签: linux bash whiptail

是bash和whiptail的新手,所以请原谅无知。

在for循环中分配var时,使用Whiptail对话框时永远不会设置新值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

2 个答案:

答案 0 :(得分:2)

管道内的命令(即由|分隔的一系列命令)总是在子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的标准输入;第一个>只是一个正常的标准重定向。

答案 1 :(得分:1)

{}内的语句通常不在子shell中执行。但是,当您向其中添加管道(|)时,它们似乎在子shell中执行。

如果您将管道移至whiptail,您会看到更新值andy