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

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

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 

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

спасибо

Ответ 1

По какой-то причине это решение обращается ко мне:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

использовать 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

Ответ 5

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

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

Это произойдет, если x - ".8" (без начального нуля), например.

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

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

Ответ 6

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

Ответ 7

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

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