Можно использовать printf
для округления:
$ printf "%.0f" 2743410360.320
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
Я не вижу ответа на проблему @ vin, а именно:
Но я получаю
(standard_in) 1: синтаксическая ошибка
Команда bc
выводит (standard_in) 1: синтаксическая ошибка
, поскольку переменная оболочки gb
не установлена:
$ unset gb
$ echo "($gb+0.5)/1" | bc
(standard_in) 1: syntax error
$ gb=2743410360.320
$ echo "($gb+0.5)/1" | bc
2743410360
В комментариях к @ dchirikov, @vin говорит, что printf "% .0f"
"не работает":
$ unset gb
$ printf '%.0f\n' $gb
0
$ gb=2743410360.320
$ printf '%.0f\n' $gb
2743410360
В обеих областях, где возникают проблемы @vin, неустановленная переменная воспроизводит проблему, а установка переменной решает проблема.
Вашей команде нужна пара ( )
:
INTValueOfGB=$( echo "($gb+0.5)/1" | bc )
Но это не округлит число, для этого нужно установить scale в 0:
INTValueOfGB=$( echo "scale=0;($gb+0.5)/1" | bc )
Это округлит (от x.5) до следующего целого числа.
Чтобы получить "округление до следующего четного целого числа" (правило банкира), нужно использовать округление printf:
LC_NUMERIC=C printf "%.0f" 2743410360.320
LC_NUMERIC нужен для того, чтобы числа обрабатывались с точкой в качестве десятичной дроби.
Это не то, что понравится пользователям в Германии, это должно работать с десятичными числами с ,
:
$ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320
2743410360
bash
4.1 встроенноеprintf
говорит “неверный номер”. Хорошо работает с/usr/bin/printf
. – manatwork 15.11.2013, 13:39bash
4.2. Или возможно проблемой не была версия – первая попытка была на Cygwin. – manatwork 17.11.2013, 14:36%i
или%.0f
? Первый говорит 'неверный номер' для меня, последних работ. – Flimzy 06.03.2015, 17:14