Как преобразовать число прочитанное из файла из str в int? - PullRequest
1 голос
/ 30 мая 2019

Я использую 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 возвращает «ожидаемое целочисленное выражение»

Я также использовал echo

val=$(echo "$((line /1))") 

if [ $val -gt 80 ]

Я получаю

синтаксическая ошибка: недопустимый арифметический оператор (маркер ошибки ...

из команды echo и, конечно, снова условие if возвращает

целочисленное выражениеожидается

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Попробуйте это Shellcheck -чистый чистый код Bash:

#! /bin/bash -p

file=/root/temp1

while read -r line ; do
    (( line > 80 )) && echo "$line > 80"
done <"$file"
  • Проблема с кодом в вопросе заключается в том, что он не обрабатывает пустые строки.Этот код обрабатывает пустые строки, потому что переменные, содержащие пустую строку, обрабатываются так, как если бы они содержали ноль в арифметических выражениях (((...))).
2 голосов
/ 30 мая 2019

Первое действие: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...