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)"