Bash错误:预期的整数表达式

时间:2015-05-09 13:00:39

标签: bash shell pipeline

在下面的部分中,您将看到我尝试在UNIX计算机上运行的shell脚本以及脚本。

当我运行此程序时,它会提供预期的输出,但它也会在转录中显示错误。可能是什么问题,我该如何解决?

首先,脚本:

#!/usr/bin/bash

while read A B C D E F
do
    E=`echo $E | cut -f 1 -d "%"`
    if test $# -eq 2
    then
        I=`echo $2`
    else
        I=90
    fi
    if test $E -ge $I
    then
        echo $F
    fi
done

运行它的成绩单:

$ df -k | ./filter.sh -c 50
./filter.sh: line 12: test: capacity: integer expression expected
/etc/svc/volatile
/var/run
/home/ug
/home/pg
/home/staff/t
/packages/turnin
$ _

1 个答案:

答案 0 :(得分:2)

在该行之前说:

if test $E -ge $I

暂时放行:

echo "[$E]"

你会发现一些非数字化的东西,那是因为df -k的输出如下所示:

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sdb1      954316620 212723892 693109608  24% /
udev               10240         0     10240   0% /dev
: :

第一个违规行,第五个字段Use%变为Use,绝对整数。

快速解决方法可能是将您的使用情况更改为:

df -k | sed -n '2,$p' | ./filter -c 50

或:

df -k | tail -n+2 | ./filter -c 50

这些额外过滤器(sedtail)中的任何一个都只会从第2行开始打印。

如果您对完全不需要特殊脚本持开放态度,那么您可能只需要使用以下内容:

df -k | awk -vlimit=40 '$5+0>=limit&&NR>1{print $5" "$6}'

它的工作方式是仅在两者都行的情况下操作:

  • 转换为数字的第五个字段至少等于-v传入的限制;和
  • 记录号(行)是两个或更多。

然后它只输出那些匹配行的相关信息。

此特定示例输出文件系统用法(如42%之类的百分比)但是,如果您只想根据脚本使用文件系统,只需更改{{1自己输出print$6

或者,如果你 百分比但没有{print $6},你可以使用我在条件中使用的相同方法:%