Linux Bashvariables在一个循环中

刚开始学习Linux Bash Shell编程,我只是不知道我是否理解正确。 看下面的示例程序:

#!/bin/bash n=1 sumRSS=1000 sumSZ=2000 echo Before sumRSS=$sumRSS sumSZ=$sumSZ ps -ly | while read c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 do if (( n>1 )) then echo n=$n rss=$sumRSS sz=$sumSZ ((sumRSS = sumRSS + c8)) ((sumSZ = sumSZ + c9)) fi ((n++)) done echo Sum of RSS = $sumRSS echo Sum of SZ = $sumSZ 

输出:

 Before sumRSS=1000 sumSZ=2000 n=2 rss=1000 sz=2000 n=3 rss=2368 sz=29118 n=4 rss=3792 sz=55644 n=5 rss=4780 sz=82679 Sum of RSS = 1000 Sum of SZ = 2000 

我不知道为什么总和仍然回到RSS = 1000和SZ = 2000。 我其实是期待RSS = 4780和SZ = 82679。

我知道我缺less一些基本的东西。 我正在通过编写简单的脚本来学习bash。

    你应该避免@linuxfan提出的管道。 您可以将您的代码更改为:

     while read c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 do ... done < <(ps -ly) 

    这样你的变量保持在相同的范围内。

    ps -ly | 而

    您会注意到管道字符“|”,它创建了两个进程。 如你所知,环境变量不能从一个进程输出到它的父进程(只限于它的后代)。 因此,可以读取和写入pipe之后的过程中使用的变量(即while语句及其主体),但一旦过程终止,它们将获得之前的值。

    的确,上面的代码行创建了两个进程:一个是ps ,其输出被传递给另一个进程,这是另一个bash 。 两个进程都会收到初始环境的副本 (即变量),并且这两个进程都可以修改其副本 。 但是原始的流程环境从未被触动!