加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:31:06 所属栏目:安全 来源:网络整理
导读:initiate () {read -p "Location(s) to look for .bsp files in? " locfind $loc -name "*.bsp" | while readdo if [ -f "$loc.bz2" ] then continue else filcount=$[$filcount+1] bzip $loc fi if [ "$scan" == "1" ]; then bzipint $loc fi echo $filcoun
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设置为循环中回显的所有内容.我可能搞砸了那个例子的语法;我目前没有编写方便的代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读