如何将 STDOUT 读入 bash 中的变量?

如何将 STDOUT 读入 bash 中的变量?

我通过 读取了带宽使用情况,它每秒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

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

例如,

if [ $in -lt 100 ] && [ $out -lt 100 ]
then
   echo Network is slow.
else
   echo Network is fast.
fi

如何读取ifstatinto$in$out变量的输出来检查if statement每秒?

答案1

由于网络速度不是整数,因此我们需要补充其他工具(例如awk)来处理数字。尝试:

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

或者,对于那些喜欢将命令分散在多行中的人:

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

怎么运行的

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

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

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

答案2

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

相关内容