Próba arytmetyki bash dla skryptu, ale $e
nie jest aktualizowana do końca. Wynik mówi sam za siebie.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: Wyświetla 1..5 jako procent.
Wynik :
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Dlaczego to?
command-line
bash
scripts
Cybex
źródło
źródło
Odpowiedzi:
bash
nie może obsługiwać arytmetyki niecałkowitej. Zapewni to poprawny wynik, o ile wszystkie wyrażenia są liczbami całkowitymi. Musisz więc unikać uzyskania wartości innej niż całkowita gdzieś w swoich obliczeniach.W przypadku, gdy oceniający
1 / 5
,2 / 5
itp tworzy liczbę całkowitą zero wartości w correspondings bash do pewnych wartości nie jest liczbą całkowitą, a wyniki wychodzą na zero odpowiednio. Pierwszeństwo dzielenia i mnożenia są takie same, a te same operatory poprzedzające są zawsze wykonywane od lewej do prawej, gdy są umieszczane w wyrażeniu.Można obejść najpierw mnożenie, a następnie dzielenie, aby bash nigdy nie musiał obsługiwać wartości niecałkowitych. Skorygowanym wyrażeniem będzie:
źródło
1/5
nie tworzy wartości innej niż całkowita . Tworzy wartość całkowitą0
, ponieważ wynikiem dzielenia liczb całkowitych 1 przez 5 jest 0. Dalsze operacje z powodzeniem wykorzystują tę wartość0
. To nie jest zamierzenie OP, ale żadna operacja nie tworzy wartości innej niż całkowita i żadna operacja nie kończy się niepowodzeniem.Bash nie radzi sobie zbyt dobrze w tego rodzaju arytmetyki ... Oto twój problem:
Jeśli potrzebujesz obsługi wartości niecałkowitych, możesz użyć
bc
(dzięki @Arronical za wskazanie, jak sformatować dane wyjściowe jako liczby całkowite)
źródło
.0
wyjście, zmieniając$percent
echo na${percent%.*}
:)W przeciwieństwie do bash, awk oferuje pełną arytmetykę zmiennoprzecinkową. Na przykład:
źródło
Próbować
:)
Patrz sekcja OCENA ARYTMETYCZNA:
Obsługuje tylko liczbę całkowitą.
źródło