bash – 从管道读取的while读取循环后变量重置

前端之家收集整理的这篇文章主要介绍了bash – 从管道读取的while读取循环后变量重置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
initiate () {
read -p "Location(s) to look for .bsp files in? " loc
find $loc -name "*.bsp" | while read
do
    if [ -f "$loc.bz2" ]
    then
        continue
    else
        filcount=$[$filcount+1]
        bzip $loc
    fi
    if [ "$scan" == "1" ]; then bzipint $loc
    fi
    echo $filcount    #Correct counting
    echo $zipcount    #Correct counting
    echo $scacount    #Correct counting
    echo $valid       #Equal to 1
done

echo $filcount    #Reset to 0
echo $zipcount    #Reset to 0
echo $scacount    #Reset to 0
echo $valid       #Still equal to 1
}

我正在编写一个bash shell脚本,使用bzip2压缩目录中的所有.bsp文件.在这个脚本中,我有几个用于计算总数的变量(文件,成功的拉链,成功的完整性扫描),但是我似乎遇到了问题.

当找到$loc -name“* .bsp”文件用尽时读取和读取退出时,它会将$filcount,$zipcount和$scacount(所有这些都在initiate()内更改(增加)),bzip()(在initiate()期间调用)或bzipint()(也在initiate()中调用).

为了测试它是否与init()或从其访问的其他函数中的变量有关,我使用echo $valid,它在initiate()之外定义(如$filcount,$zipcount等),但是不会从initiate()内部的另一个函数或者init()内部的其他函数更改.

有趣的是,$valid不会像启动中的其他变量一样重置为0.

任何人都可以告诉我为什么我的变量在读取退出时会神奇地重置?

我昨天遇到了这个问题.

麻烦的是你正在找$loc -name“* .bsp”|读的时候.因为这涉及管道,所以while读取循环实际上不能在与脚本的其余部分相同的bash进程中运行; bash必须生成一个子进程,以便它可以将find的stdout连接到while循环的stdin.

这一切都非常聪明,但这意味着在循环之后无法看到循环中设置的任何变量,这完全违背了我编写的while循环的整个目的.

您可以尝试在不使用管道的情况下将输入提供给循环,也可以在不使用变量的情况下从循环中获取输出.我最终得到了可怕的憎恶,包括写入临时文件并将整个循环包装在$(…)中,如下所示:

var="$(producer | while read line; do
    ...
    echo "${something}"
done)"

这让我将var设置为循环中回显的所有内容.我可能搞砸了那个例子的语法;我目前没有编写方便的代码.

猜你在找的Bash相关文章