【问题标题】:Setting variables inside a Bash loop在 Bash 循环中设置变量
【发布时间】:2017-01-27 07:51:49
【问题描述】:

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

【问题讨论】:

  • 这个示例代码是你写的吗?
  • @GeorgeVasiliou 不,我是从我订阅的在线学习网站之一获得的。为了我的个人学习,我进行了一些编辑和探索。我以为这很简单,但我遇到了这个问题。
  • 欢迎来到 Bash!提示:您可以在脚本中包含选项set -xv(就在#!/bin/bash 行之后)。这将启用详细模式并帮助您查看正在发生的事情。实际上,在您的屏幕上,bash 会通知您将要执行的代码(逐步)和变量的值...有用的调试选项。
  • 顺便问一下,在学习站点中,他们会建议预期的输出是什么?我运行了这个测试,我得到了和你一样的结果。

标签: bash scope scripting


【解决方案1】:

您应该按照@linuxfan 的建议避开管道。您可以将代码更改为:

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

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

【讨论】:

  • 完成
  • &lt; 表示数据必须以这种方式流动。 &lt;() 是进程替换;看这里:mywiki.wooledge.org/ProcessSubstitution
  • 通常&gt; 用于将数据打印到文件中,例如:“echo test”> 文件名。 &gt;&gt; 表示:追加到文件。
【解决方案2】:

ps -ly |而

您注意到管道字符“|”,它创建了 两个 进程。如您所知,环境变量不能从进程导出到其父进程(仅导出到其后代)。所以在管道之后的进程中使用的变量,也就是你的while语句和它的主体,是可以读写的,但是一旦进程终止,它们就会得到之前的值。

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

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2011-06-02
    • 2019-01-05
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2012-10-01
    相关资源
    最近更新 更多