2009-11-23 3 views
10

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

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

0,70 и 0,80, не являются целыми числами. – ypnos

ответ

2

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

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

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

2

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

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

0

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

+0

Не совсем верно. Оболочка Bourne не знала о целых числах, но Bash делает через «typeset -i». –

1

Использование 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 
+0

Очень клевер. Работает лучше, чем bc. Это позволило мне использовать переменные, которые были требованием, а не статическими числами. Спасибо. Простой и понятный. Мне пришлось изучить bc, чтобы использовать его, нужно быстрое и простое решение! Спасибо! – jewettg

14

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

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

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

+0

'bc' то, что мне нужно. Спасибо, ghostdog74! –

+0

'bc <<<"0.8 > 0.7" 'делает это с меньшими накладными расходами. – Alfe

1

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

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

Это будет ошибкой, если x является»+0,8" (без лидирующего нуля), к примеру.

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

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

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

BaseLine=70.0   
if [ $string \> $BaseLine ] 
then 
     echo $string 
else 
     echo "TOO SMALL" 
fi 
Смежные вопросы