В скрипте оболочки 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