在Bash循环中设置变量

时间:2017-01-27 07:51:50

标签: bash scope scripting

刚开始学习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。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

  

ps -ly |而

您注意到管道符号&#34; |&#34;,它会创建两个进程。如您所知,环境变量无法从进程导出到其父级(仅限于其后代)。因此,管道之后的过程中使用的变量(即 while 语句及其主体)可以被读取和写入,但是一旦过程终止,它们就会得到之前的值。

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