сравнение целых чисел и чисел с плавающей точкой в ​​сценарии оболочки - PullRequest
3 голосов
/ 30 марта 2012

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

У меня есть несколько примеров, таких как

 set X=3.1
  set Y=4.1
  if [ $X < $Y ] then
    echo "wassup"
  endif

Но запуск вышеуказанного из задания cron, похоже, не работает.

Ответы [ 4 ]

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

Способ выполнения операций с плавающей запятой в bash заключается в использовании bc , который доступен почти во всех дистрибутивах Linux.

# bc will return 0 for false and 1 for true
if [ $(echo "23.3 > 7.3" | bc) -ne 0 ] 
then 
  echo "wassup"
fi

В журнале linux доступна хорошая статья о математике с плавающей точкой в ​​bash с использованием bc.

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

Бах сам обрабатывает только целые числа.Используйте bc:

echo "$X>$Y" | bc 
0
echo "$X<$Y" | bc 
1

Вам не нужно беспокоиться о масштабе.Это просто для предопределения форматов вывода:

X=3.000001
Y=3.0001
echo "$X>$Y" | bc 
0
echo "$X<$Y" | bc 
1
echo "scale=1;$X<$Y" | bc 
1
0 голосов
/ 30 марта 2012

EDIT. на основе комментариев к этому ответу (благодаря пользователь неизвестен и Гленн Джекман ), кажется, что при использовании bc для теста true / false требуемый bash тест - это просто:

  • (( $(echo "$X < $Y" |bc) )) ... см. Результаты теста и скрипт ниже

Когда для теста bash старого стиля [ ] необходимо сравнение с -ne 0.


bash изначально не обрабатывает числа с плавающей запятой, но вы можете вызвать такую ​​утилиту, как bc

С man bc - язык калькулятора произвольной точности

X=3.1
Y=4.1
# This test has two superfluous components. 
# See EDIT (above) and TESTS below
if (($(echo "scale=9; $X < $Y" |bc)!=0)) ;then
    echo "wassup"
fi

Результаты теста:

if [  "1"  ]   true
   [  "1"  ]   true
if [  "0"  ]   true
   [  "0"  ]   true

if [   1   ]   true
   [   1   ]   true
if [   0   ]   true
   [   0   ]   true

if (( "1" ))   true
   (( "1" ))   true
if (( "0" ))   false
   (( "0" ))   false

if ((  1  ))   true
   ((  1  ))   true
if ((  0  ))   false
   ((  0  ))   false

echo "1<1"|bc  true
echo "1<0"|bc  true

ТЕСТ-скрипт:

printf 'if [  "1"  ]   '; if [ "1" ]; then echo true; else echo false; fi
printf '   [  "1"  ]   ';    [ "1" ]  &&   echo true  ||   echo false
printf 'if [  "0"  ]   '; if [ "0" ]; then echo true; else echo false; fi
printf '   [  "0"  ]   ';    [ "0" ]  &&   echo true  ||   echo false
echo  
printf 'if [   1   ]   '; if [  1  ]; then echo true; else echo false; fi
printf '   [   1   ]   ';    [  1  ]  &&   echo true  ||   echo false
printf 'if [   0   ]   '; if [  0  ]; then echo true; else echo false; fi
printf '   [   0   ]   ';    [  0  ]  &&   echo true  ||   echo false
echo  
printf 'if (( "1" ))   '; if (("1")); then echo true; else echo false; fi
printf '   (( "1" ))   ';    (("1"))  &&   echo true  ||   echo false
printf 'if (( "0" ))   '; if (("0")); then echo true; else echo false; fi
printf '   (( "0" ))   ';    (("0"))  &&   echo true  ||   echo false
echo  
printf 'if ((  1  ))   '; if (( 1 )); then echo true; else echo false; fi
printf '   ((  1  ))   ';    (( 1 ))  &&   echo true  ||   echo false
printf 'if ((  0  ))   '; if (( 0 )); then echo true; else echo false; fi
printf '   ((  0  ))   ';    (( 0 ))  &&   echo true  ||   echo false
echo
printf 'echo "1<1"|bc  '; echo "1<1"|bc >/dev/null  && echo true || echo false 
printf 'echo "1<0"|bc  '; echo "1<0"|bc >/dev/null  && echo true || echo false 
0 голосов
/ 30 марта 2012

Пример ниже работает на оболочке bash.

 X=3.1
 Y=4.1
 if [ $X -le $Y ]
 then
    echo "wassup"
 fi

вы можете изучить скрипт оболочки здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...