你如何在 bash 中将 STDOUT 读入变量?

Goo*_*bot 6 bash shell-script stdout

我读取了带宽使用情况ifstat,它STDOUT每秒打印下载和上传。

ifstat -i wlp7s0
      wlp7s0      
 KB/s in  KB/s out
 1390.13     81.20
 1039.14     74.05
 1810.63    102.08
  865.60    183.15
 1272.91    274.19
 1174.00    400.04
Run Code Online (Sandbox Code Playgroud)

如果值小于一个数量,如何ifstat在 bash 脚本中运行并将值读入变量if statement以运行命令?

例如,

if [ $in -lt 100 ] && [ $out -lt 100 ]
then
   echo Network is slow.
else
   echo Network is fast.
fi
Run Code Online (Sandbox Code Playgroud)

如何读取ifstatinto$in$outvariables的输出以if statement每秒检查一次?

Joh*_*024 13

由于网速不是整数,所以需要辅以awk等其他工具来处理数字。尝试:

ifstat -ni wlp7s0 | awk 'NR>2{if ($1+0<100 && $2+0<100) print "Network is slow."; else print "Network is fast."}'
Run Code Online (Sandbox Code Playgroud)

或者,对于那些喜欢他们的命令分布在多行中的人:

ifstat -ni wlp7s0 | awk '
    NR>2{
        if ($1+0<100 && $2+0<100)
            print "Network is slow."
        else
            print "Network is fast."
    }'
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

-n添加该选项ifstat以抑制标题行的周期性重复。

NR>2{...}告诉 awk 仅当行号NR大于 2时才处理花括号中的命令。这具有跳过标题行的效果。

if ($1+0<100 && $2+0<100)测试第一个字段$和第二个字段$2是否都小于 100。如果是,则print "Network is slow."执行。如果没有,则print "Network is fast."执行。


gle*_*man 13

John1024 关于浮点数是正确的,但我们可以截断数字。使用普通的 bash:

n=0
LC_NUMERIC=C  ifstat -i $interface  \
| while read -r in out; do
  ((++n < 2)) && continue # skip the header
  if (( ${in%.*} < 100 && ${out%.*} < 100 )); then
    echo Network is slow.
  else
    echo Network is fast.
  fi
done
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于使用句点作为小数分隔符的语言环境(这似乎是 OP 的情况)。设置`LC_NUMERIC=C` 会处理其他语言环境。 (3认同)