В скрипте оболочки bash как преобразовать строку в число

Эй, я хотел бы преобразовать строку в число

x="0.80"

#I would like to convert x to 0.80 to compare like such:
if[ $x -gt 0.70 ]; then

echo $x >> you_made_it.txt 

fi 

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

спасибо

7 ответов


почему - то это решение мне нравится:

if ! echo "$x $y -p" | dc | grep > /dev/null ^-; then
  echo "$x > $y"
else
  echo "$x < $y"
fi

вы должны быть уверены, что $x и $y действительны (например содержат только числа и ноль или единицу.') и, в зависимости от того, сколько лет вашему dc, вам может понадобиться укажите что-то вроде '10k', чтобы получить его распознавать нецелочисленные значения.


вы можете использовать bc

$ echo "0.8 > 0.7" | bc
1
$ echo "0.8 < 0.7" | bc
0
$ echo ".08 > 0.7" | bc
0

поэтому вы можете проверить 0 или 1 в своем скрипте.


Bash не понимает чисел с плавающей запятой. Он понимает только целые числа.

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


использовать на awk

x="0.80"
y="0.70"
result=$(awk -vx=$x -vy=$y 'BEGIN{ print x>=y?1:0}')
if [ "$result" -eq 1 ];then
    echo "x more than y"
fi

если ваши значения гарантированно будут в той же форме и диапазоне, вы можете выполнить сравнение строк:

if [[ $x > 0.70 ]]
then
    echo "It's true"
fi

это не удастся, если x is ".8" (без ведущего нуля), например.

однако, в то время как Баш не понимает десятичные дроби, его builtin printf форматировать их. Таким образом, вы можете использовать это, чтобы нормализовать свои ценности.

$ x=.8
$ x=$(printf %.2 $x)
$ echo $x
0.80

язык bash лучше всего охарактеризовать как полнофункциональный макропроцессор, поэтому нет никакой разницы между числами и строками. Проблема в том, что тест(1) работает на целых числах.


вот мое простое решение:

 BaseLine=70.0         
 if [ $string \> $BaseLine ]
 then
      echo $string
 else
      echo "TOO SMALL"
 fi