我使用bash,我必须读取一个包含多行的文件
每行由一个数字组成。然后,对于每一行(数字),我必须检查值是否> 80。
这是我的问题,无论我尝试什么,我都会得到:
>integer expression expected
if条件之后。那是因为我用来放置行值的变量是一个字符串。
这是我的原始文件
[root@michelep_centos2 ~]# cat temp1
0
0
0
98
0
0
79
0
81
我在bash脚本中
##!/bin/bash
file=/root/temp1
while IFS= read -r line
do
if [ 'expr $line /1' -gt 80 ]
then echo "hit>80"
fi
done <"$file"
在这里expr返回错误,因为$ line是一个字符串。我尝试使用另一个变量
val=$(($line + 0))
if [ $val -gt 80 ]
此处的if条件返回“期望的整数表达式”
我也用过回声
val=$(echo "$((line /1))")
if [ $val -gt 80 ]
我明白了
语法错误:无效的算术运算符(错误标记为...
通过echo命令,当然还有if条件返回
预期为整数
答案 0 :(得分:2)
第一个操作: dos2unix -f inputfile
第二步:
从输入文件中可以看到它包含空行,这将导致if
比较失败。您可以在-gt 80
检查的顶部放置一个额外的检查,以确保在使用$line
传递变量if [ ! -z $line ]
之前不将其清空,或者更好的是,您可以检查以确保该行是整数或可能都使用AND。
示例:
while read line;
do
if [[ $line =~ ^[0-9]+$ ]];then
if [ $line -gt 80 ];then
echo "$line is greater then 80"
fi
fi
done <input_file
或者,如果您不想放空支票([ ! -z $line ]
),
此外,可以在一行中使用其他工具(例如awk
)来完成此操作,但这可能符合或可能不符合您的要求。
awk 'NF && $0>80{print $0 ,"is greater then 80"}' inputfile
答案 1 :(得分:2)
尝试使用这种Shellcheck干净的纯Bash代码:
#! /bin/bash -p
file=/root/temp1
while read -r line ; do
(( line > 80 )) && echo "$line > 80"
done <"$file"
((...))
)中被视为包含零。