Ошибка неверного числа в условии оператора сравнения значений с плавающей точкой в ​​Linux

522
Pimp Juice IT

Я пытаюсь проверить некоторую логику на Antminer S9, где я получаю выходные данные команды, а затем из этого вывода я беру определенное значение с плавающей запятой, чтобы затем я мог поместить это значение в переменную и обработать с помощью некоторой условной логики, чтобы сделать некоторые чеки и тому подобное.

Я все еще изучаю скрипты для Linux и bash, так что я далеко не эксперт, поэтому я могу упустить что-то простое, но не могу получить значение переменной 14167.25для проверки, больше ли оно, чем 1в простом примере. Я думаю, это потому, что это значение задано как строковый тип, и оно должно быть, intи я не могу легко понять это, поэтому я решил обратиться к другим за помощью.

команда

cool=$(/usr/bin/bmminer-api stats | grep -o 'GHS 5s].*' | cut -f2 -d'>') 

Примечание. Похоже, это отражает правильное значение, как и ожидалось, 14167.25однако я получаю сообщение об ошибке условной логики для сравнения этого числа с другим.


Моя проблема начинается здесь, я думаю ...

Условная команда

if [ $cool -gt 1 ]; then echo it is greater than 1; fi 

Ошибка: это дает мне ошибку sh: 14167.25: bad number.


Другие вещи, которые я пробовал

Я попытался удвоить, [[ $cool -gt 1 ]]а также использовать $($cool)и, "$cool"возможно, несколько других вариантов для переменной как в двойной, так и в одной квадратной скобке оператора if, и ничто не дает мне ожидаемого результата; ошибка новичка возможно !!

Я также перечитал эти посты и попробовал различные неудачные вещи, которые я, вероятно, не должен перечислять:


Другие детали

uname -sr Linux 3.14.0-xilinx-ge8a2f71-dirty 

" bmminer-api stats" Command Output

Reply was 'STATUS=S,When=1012053,Code=70,Msg=BMMiner stats,Description=bmminer 1.0.0|BMMiner=2.0.0,Miner=16.8.1.3,CompileTime=Mon Nov 6 17:17:48 CST 2017,Type=Antminer S9|STATS=0,ID=EE50,Elapsed=964517,Calls=0,Wait=0.000000,Max=0.000000,Min=99999999.000000,GHS 5s=14167.25,GHS av=14115.38,miner_count=3,frequency=662,fan_num=2,fan1=0,fan2=0,fan3=5640,fan4=0,fan5=0,fan6=6120,fan7=0,fan8=0,temp_num=3,temp1=0,temp2=0,temp3=0,temp4=0,temp5=0,temp6=64,temp7=61,temp8=65,temp9=0,temp10=0,temp11=0,temp12=0,temp13=0,temp14=0,temp15=0,temp16=0,temp2_1=0,temp2_2=0,temp2_3=0,temp2_4=0,temp2_5=0,temp2_6=74,temp2_7=72,temp2_8=76,temp2_9=0,temp2_10=0,temp2_11=0,temp2_12=0,temp2_13=0,temp2_14=0,temp2_15=0,temp2_16=0,temp3_1=0,temp3_2=0,temp3_3=0,temp3_4=0,temp3_5=0,temp3_6=0,temp3_7=0,temp3_8=0,temp3_9=0,temp3_10=0,temp3_11=0,temp3_12=0,temp3_13=0,temp3_14=0,temp3_15=0,temp3_16=0,freq_avg1=0.00,freq_avg2=0.00,freq_avg3=0.00,freq_avg4=0.00,freq_avg5=0.00,freq_avg6=656.22,freq_avg7=650.38,freq_avg8=656.88,freq_avg9=0.00,freq_avg10=0.00,freq_avg11=0.00,freq_avg12=0.00,freq_avg13=0.00,freq_avg14=0.00,freq_avg15=0.00,freq_avg16=0.00,total_rateideal=14001.40,total_freqavg=654.49,total_acn=189,total_rate=14167.24,chain_rateideal1=0.00,chain_rateideal2=0.00,chain_rateideal3=0.00,chain_rateideal4=0.00,chain_rateideal5=0.00,chain_rateideal6=4666.72,chain_rateideal7=4667.13,chain_rateideal8=4667.54,chain_rateideal9=0.00,chain_rateideal10=0.00,chain_rateideal11=0.00,chain_rateideal12=0.00,chain_rateideal13=0.00,chain_rateideal14=0.00,chain_rateideal15=0.00,chain_rateideal16=0.00,temp_max=65,Device Hardware%=0.0000,no_matching_work=502,chain_acn1=0,chain_acn2=0,chain_acn3=0,chain_acn4=0,chain_acn5=0,chain_acn6=63,chain_acn7=63,chain_acn8=63,chain_acn9=0,chain_acn10=0,chain_acn11=0,chain_acn12=0,chain_acn13=0,chain_acn14=0,chain_acn15=0,chain_acn16=0,chain_acs1=,chain_acs2=,chain_acs3=,chain_acs4=,chain_acs5=,chain_acs6= oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo,chain_acs7= oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo,chain_acs8= oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo,chain_acs9=,chain_acs10=,chain_acs11=,chain_acs12=,chain_acs13=,chain_acs14=,chain_acs15=,chain_acs16=,chain_hw1=0,chain_hw2=0,chain_hw3=0,chain_hw4=0,chain_hw5=0,chain_hw6=192,chain_hw7=152,chain_hw8=155,chain_hw9=0,chain_hw10=0,chain_hw11=0,chain_hw12=0,chain_hw13=0,chain_hw14=0,chain_hw15=0,chain_hw16=0,chain_rate1=,chain_rate2=,chain_rate3=,chain_rate4=,chain_rate5=,chain_rate6=4750.90,chain_rate7=4729.46,chain_rate8=4686.88,chain_rate9=,chain_rate10=,chain_rate11=,chain_rate12=,chain_rate13=,chain_rate14=,chain_rate15=,chain_rate16=,chain_xtime6=,chain_xtime7={},chain_xtime8=,chain_offside_6=0,chain_offside_7=0,chain_offside_8=0,chain_opencore_6=1,chain_opencore_7=1,chain_opencore_8=0,miner_version=16.8.1.3,miner_id=999c7401123b999c|' [STATUS] => ( [STATUS] => S [When] => 1012053 [Code] => 70 [Msg] => BMMiner stats [Description] => bmminer 1.0.0 )v [BMMiner2.0.0] => ( [BMMiner] => 2.0.0 [Miner] => 16.8.1.3 [CompileTime] => Mon Nov 6 17:17:48 CST 2017 [Type] => Antminer S9 ) [STATS0] => ( [STATS] => 0 [ID] => EE50 [Elapsed] => 964517 [Calls] => 0 [Wait] => 0.000000 [Max] => 0.000000 [Min] => 99999999.000000 [GHS 5s] => 14167.25 [GHS av] => 14115.38 [miner_count] => 3 [frequency] => 662 [fan_num] => 2 [fan1] => 0 [fan2] => 0 [fan3] => 5640 [fan4] => 0 [fan5] => 0 [fan6] => 6120 [fan7] => 0 [fan8] => 0 [temp_num] => 3 [temp1] => 0 [temp2] => 0 [temp3] => 0 [temp4] => 0 [temp5] => 0 [temp6] => 64 [temp7] => 61 [temp8] => 65 [temp9] => 0 [temp10] => 0 [temp11] => 0 [temp12] => 0 [temp13] => 0 [temp14] => 0 [temp15] => 0 [temp16] => 0 [temp2_1] => 0 [temp2_2] => 0 [temp2_3] => 0 [temp2_4] => 0 [temp2_5] => 0 [temp2_6] => 74 [temp2_7] => 72 [temp2_8] => 76 [temp2_9] => 0 [temp2_10] => 0 [temp2_11] => 0 [temp2_12] => 0 [temp2_13] => 0 [temp2_14] => 0 [temp2_15] => 0 [temp2_16] => 0 [temp3_1] => 0 [temp3_2] => 0 [temp3_3] => 0 [temp3_4] => 0 [temp3_5] => 0 [temp3_6] => 0 [temp3_7] => 0 [temp3_8] => 0 [temp3_9] => 0 [temp3_10] => 0 [temp3_11] => 0 [temp3_12] => 0 [temp3_13] => 0 [temp3_14] => 0 [temp3_15] => 0 [temp3_16] => 0 [freq_avg1] => 0.00 [freq_avg2] => 0.00 [freq_avg3] => 0.00 [freq_avg4] => 0.00 [freq_avg5] => 0.00 [freq_avg6] => 656.22 [freq_avg7] => 650.38 [freq_avg8] => 656.88 [freq_avg9] => 0.00 [freq_avg10] => 0.00 [freq_avg11] => 0.00 [freq_avg12] => 0.00 [freq_avg13] => 0.00 [freq_avg14] => 0.00 [freq_avg15] => 0.00 [freq_avg16] => 0.00 [total_rateideal] => 14001.40 [total_freqavg] => 654.49 [total_acn] => 189 [total_rate] => 14167.24 [chain_rateideal1] => 0.00 [chain_rateideal2] => 0.00 [chain_rateideal3] => 0.00 [chain_rateideal4] => 0.00 [chain_rateideal5] => 0.00 [chain_rateideal6] => 4666.72 [chain_rateideal7] => 4667.13 [chain_rateideal8] => 4667.54 [chain_rateideal9] => 0.00 [chain_rateideal10] => 0.00 [chain_rateideal11] => 0.00 [chain_rateideal12] => 0.00 [chain_rateideal13] => 0.00 [chain_rateideal14] => 0.00 [chain_rateideal15] => 0.00 [chain_rateideal16] => 0.00 [temp_max] => 65 [Device Hardware%] => 0.0000 [no_matching_work] => 502 [chain_acn1] => 0 [chain_acn2] => 0 [chain_acn3] => 0 [chain_acn4] => 0 [chain_acn5] => 0 [chain_acn6] => 63 [chain_acn7] => 63 [chain_acn8] => 63 [chain_acn9] => 0 [chain_acn10] => 0 [chain_acn11] => 0 [chain_acn12] => 0 [chain_acn13] => 0 [chain_acn14] => 0 [chain_acn15] => 0 [chain_acn16] => 0 [chain_acs1] => [chain_acs2] => [chain_acs3] => [chain_acs4] => [chain_acs5] => [chain_acs6] => oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo [chain_acs7] => oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo [chain_acs8] => oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooooo [chain_acs9] => [chain_acs10] => [chain_acs11] => [chain_acs12] => [chain_acs13] => [chain_acs14] => [chain_acs15] => [chain_acs16] => [chain_hw1] => 0 [chain_hw2] => 0 [chain_hw3] => 0 [chain_hw4] => 0 [chain_hw5] => 0 [chain_hw6] => 192 [chain_hw7] => 152 [chain_hw8] => 155 [chain_hw9] => 0 [chain_hw10] => 0 [chain_hw11] => 0 [chain_hw12] => 0 [chain_hw13] => 0 [chain_hw14] => 0 [chain_hw15] => 0 [chain_hw16] => 0 [chain_rate1] => [chain_rate2] => [chain_rate3] => [chain_rate4] => [chain_rate5] => [chain_rate6] => 4750.90 [chain_rate7] => 4729.46 [chain_rate8] => 4686.88 [chain_rate9] => [chain_rate10] => [chain_rate11] => [chain_rate12] => [chain_rate13] => [chain_rate14] => [chain_rate15] => [chain_rate16] => [chain_xtime6] =>  [chain_xtime7] => {} [chain_xtime8] =>  [chain_offside_6] => 0 [chain_offside_7] => 0 [chain_offside_8] => 0 [chain_opencore_6] => 1 [chain_opencore_7] => 1 [chain_opencore_8] => 0 [miner_version] => 16.8.1.3 [miner_id] => 999c7401123b999c ) 
1

1 ответ на вопрос

3
l0b0

Как указано в разделе «Как вычислить числа с плавающей запятой вместо целых чисел?» пост, главное в том, что «встроенная арифметика BASH использует только целые числа», и вы работаете с типом данных с плавающей запятой, с которым BASH не может выполнять операции сравнения .

Временное решение

В качестве обходного пути, о котором говорилось в публикации «Сравнение с плавающей точкой в ​​сценарии оболочки», можно использовать bcдля выполнения операций сравнения типов данных с плавающей запятой. Вы можете оценить, является ли он результатом true или false, и в соответствии с его результатом использовать условный логический процесс.

Пример логики

if [ "$(echo "$cool > 1" | bc)" -eq 1 ] then echo "$ is greater than 1" fi 
Кажется, это то, что мне было нужно, и вещь, которую я полностью игнорировал. Конечно, я использую тип данных с плавающей точкой для этой операции. Это заставило меня двигаться в правильном направлении точно. Pimp Juice IT 5 лет назад 0
Использует `[" $ (echo "$ cool> 1" | bc) "-eq 1]` над синтаксисом `[$ (bc <<<" $ cool> 1 ") -eq 1]` исключительно из личных предпочтений что вы знаете или у вас есть что-то вроде гоча или чего-то еще? Pimp Juice IT 5 лет назад 0
`<<<` - это [bashism] (https://mywiki.wooledge.org/Bashism); мое изменение делает его совместимым с POSIX. Вопрос затрагивает Bash, но не теги, поэтому я подумал, что лучше быть в безопасности. l0b0 5 лет назад 2

Похожие вопросы