ошибка [: отсутствует `]’ при сравнении переменных с числами с плавающей запятой в скрипте bash

#bash #variables #comparison

#bash #переменные #сравнение

Вопрос:

temp.txt это файл с одной строкой:

1.2034 3.2323 4.3121 5.1223

Я должен выполнить следующий набор операций несколько раз с разными значениями, чтобы все это было в цикле. Ниже приведена основная проблема, с которой я сталкиваюсь, и я был бы признателен за помощь в ее решении.


 v1=$(cut -d" " -f2 temp.txt);

v2=$(cut -d" " -f3 temp.txt);

v3=$(cut -d" " -f4 temp.txt);

v4=$(cut -d" " -f5 temp.txt);


#$v1, $v2, $v3, $v4 contain the above 4 values (1.2034, 3.2323, 4.3121, 5.1223). I have verified that. I want to compare their values, but when I do, I get an error because of incorrect syntax.

if [ "$v1" -gt "$v2" | bc ] amp;amp; [ "$v3" -gt "$v4" | bc ]; then

    echo Yes

fi
  

Я получаю эту ошибку:

 line 6: [: missing `]'

File ] is unavailable.
  

Может кто-нибудь, пожалуйста, помочь мне с моим синтаксисом? Я уже пробовал несколько разных вещей, и это не сработало. Я пробовал разные комбинации скобок и пробелов, как с использованием bc, так и без bc.

Комментарии:

1. | в оболочке для создания каналов между командами, например cat foo | wc -l . Почему вы [ "$v1" -gt "$v2" передаете вывод to bc ] ?

Ответ №1:

Вы хотите создать допустимое bc выражение и передать его bc , захватить выходные данные, а затем сравнить их с ожидаемым результатом.

 if [[ $(echo "$v1 > $v2" | bc) == 1  amp;amp;  $(echo "$v3 > $v4" | bc) == 1 ]]; then
  echo Yes
fi
  

Если bash бы вы могли выполнять арифметику с плавающей запятой (или если ваши значения на самом деле были целыми числами), вы могли бы выполнять сравнения непосредственно в bash :

 if [[ $v1 -gt $v2 amp;amp; $v3 -gt $v4 ]]; then echo Yes; fi
  

или

 if (( v1 > v2 amp;amp; v3 > v4 )); then echo Yes; fi
  

Более быстрый способ заполнить ваши четыре переменные

 read x1 v1 v2 v3 v4 x2 < temp.txt
  

( x1 и x2 это просто переменные, значение которых нас на самом деле не волнует; первое поле и любые поля, которые могут возникнуть после 5-го тона.)