как сделать bc, чтобы показать мне 10, а не 10.00

#!/bin/bash q=$(bc <<< "scale=2;$p*100") head -n$q numbers.txt > secondcoordinate.txt 

Это всего лишь часть сценария, но я думаю, что этого достаточно, чтобы прояснить мои намерения. p – переменная с двумя десятичными запятыми, поэтому q должно быть целым числом … Тем не менее, bc показывает, например, 10.00 вместо 10 .

Как я могу это решить?

Вы не можете сделать это с очевидным scale=0 из-за того, как определяется масштаб.

Документация косвенно объясняет, что деление на единицу достаточно для сброса вывода в соответствии со значением scale , которое по умолчанию равно нулю:

expr1 / expr2 . Результатом выражения является фактор двух выражений. Масштабы результата – это значение переменной шкалы.

 p=12.34; echo "($p*100)" | bc 1234.00 p=12.34; echo "($p*100)/1" | bc 1234 

Если ваша версия bc не справляется с этим, проведите ее через sed :

 p=12.34; echo "($p*100)" | bc | sed 's!\.0*$!!' 1234 

Этот RE будет только отбрасывать конечные нули из целого числа. Так что 3.00 уменьшится до 3, но 3.10 не уменьшится до 3.1. Если вам действительно нужна полная возможность сбрасывать конечные нули из десятичного числа, требуется PCRE:

 p=12.34; echo "($p*100)" | bc | perl -pe '/\./ && s/0+$/$1/ && s/\.$//' 

Но если вы собираетесь использовать perl тогда вы можете обойтись без bc в первую очередь:

 p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p" 

вы можете использовать awk для вычисления значений

 bash-3.2$ p=0.01 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 1 bash-3.2$ p=0.02 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 2 bash-3.2$ p=0.022 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 2.2 

TL; DR

У вас много вариантов. bc знает поведение, когда scale=0 не всегда делает то, что вы ожидаете, но есть много обходных решений. Здесь только несколько.

Printf

Используйте printf для ограничения вывода на целые числа.

 $ printf "%g\n" $(echo '12.34 * 100' | bc) 1234 

bc с делением

Если вы хотите придерживаться масштабирования bc , вам нужно указать как шкалу нуля, так и разделить на 1, чтобы сбросить масштаб. Это известное поведение, но я действительно не могу объяснить, почему.

 $ echo '12.34 * 100 / 1' | scale=0 bc 1234 

СЕПГ

Просто удалите ненужные завершающие символы.

 $ echo '12.34 * 100' | bc | sed 's/\.00$//' 1234 

удар

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

 $ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00} 1234