Двойные выражения скрипта Bash, вызывающие проблему - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь написать простой скрипт, который проверяет количество строк, содержащих определенную строку (которая содержит двойную). Однако у меня есть некоторые проблемы. Вот сценарий, который я написал

#!/bin/bash

x=0.1
while [ $x -le 5 ]
do
        cat b.txt | grep "Red: $x" | wc -l >> blah
        x=$(( $x + 0.1 ))
done

Однако, когда я пытаюсь выполнить его, я получаю следующую ошибку, которую я не знаю, как ее решить:

/counter: line 4: [: 0.1: integer expression expected

Пожалуйста, кто-нибудь может мне помочь?

Файл примера:

Red: 0.1
Red: 1.1
Red: 2.3
Red: 0.5
Red: 3.9
Red: 1.0
Red: 4.4

Ответы [ 4 ]

2 голосов
/ 12 марта 2012

Bash работает только с целыми числами. См. Раздел «Арифметическая оценка» на странице руководства по bash.

(Даже если бы он имел число с плавающей запятой, у вас возникли бы проблемы с десятичными дробями. Рассмотрите возможность представления 0,1 со значением 1, 0,2 как 2 и т. Д., Чтобы 4.7 стало 47. Затем вы можете выполнить grep для следующих десятичных цифр буквальным периодом, за которым следуют цифры.)

1 голос
/ 12 марта 2012

Лучше использовать awk для этого типа non-Integer Mathematical calculations. Рассмотрим скрипт awk:

awk '/Red:/{if (sum<5) sum+=$2;} END{print sum;}' file
1 голос
/ 12 марта 2012

Вы можете использовать bc, чтобы сделать арифметику с плавающей точкой:

[ $(bc<<<"$x<5") -eq 1 ]
1 голос
/ 12 марта 2012

для операций с плавающей точкой, лучше всего использовать «bc»: вот достойное руководство: http://www.linuxjournal.com/content/floating-point-math-bash

x=0.1
x=`echo $x+0.1|bc`
...