首页 > 解决方案 > 如何将从文件中读取的数字从str转换为int?

问题描述

我使用 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 条件返回

需要整数表达式

标签: stringbashshellinteger

解决方案


第一个动作: 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

或者,如果您不想放空 check( [ ! -z $line ]) ,

此外,这可以使用其他工具(例如awk一行)来完成,但这可能符合您的要求,也可能不符合您的要求。

awk 'NF && $0>80{print $0 ,"is greater then 80"}' inputfile

推荐阅读