c=$( printf '%s - %s\n' "$a" "$b" | bc )
ou, para os preguiçosos,
c=$( echo "$a - $b" | bc )
ou, para o usuário preguiçoso bash ,
c=$( bc <<<"$a - $b" )
O problema com o seu código é que
c=$((a-b)) | bc
não funciona. Você pode somente (útil) canalizar coisas que produzem saída e c=$((a-b)) é uma atribuição que 1) falhará se $a ou $b forem números de ponto flutuante (com um erro de sintaxe) e 2) não produzir saída . Além disso, a saída de bc (nothing) não será atribuída a c , uma vez que não faz parte da atribuição.