bash 错误 : Integer expression expected

标签 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
$ _

最佳答案

在这行之前:

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传入的限制;和
  • 记录数(行)为 2 或更多。

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

这个特定示例输出文件系统使用情况(以42%之类的百分比表示),但是,如果您只想按照脚本使用文件系统,只需更改print 单独输出 $6:{print $6}

或者,如果您执行百分比但没有%,则可以使用我在条件条件中使用的相同方法:{print $5+0"“$6}

关于 bash 错误 : Integer expression expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140228/

相关文章:

linux - 将 Windows 路径转换为 ​​Linux 路径的 Bash 脚本

linux - 删除shell中一行的最后一个字

bash - 用一行将项目添加到逗号分隔列表

terraform - 命令行参数过多 Terraform 计划

bash - 在 bash 脚本上正确格式化 crontab 可执行文件

python - 在Python中,应该如何测试环境变量中指定的路径中是否存在文件?

c - 如何用C代码编写shell '&'?

regex - 在文件和输出文件名中搜索具有特定文本的行(文件命令和 grep)

python - 如何使用 RAPIDS 加速管道中由容器分隔的模块

linux - 是否有相当于 PowerShell 的 CmdLets 的 Bash,它充当管道过滤器?