如何将从文件读取的数字从str转换为int?

时间:2019-05-30 15:59:47

标签: string bash shell integer

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

  

预期为整数

2 个答案:

答案 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"
  • 问题代码的问题在于它不处理空行。该代码确实处理空行,因为包含空字符串的变量在算术表达式(((...)))中被视为包含零。