Citat:
Ursprungligen postat av Lanix
calc verkar inget standardprogram. Jag håller på med en uppgift som ska fungera utan extra program. Bourne ska klara köra det också, så inget Bash-specifikt.
Jo, som sagt vet jag hur scale fungerar men det är oanvändbart eftersom det kapar istället för att avrunda. Om man nu överser med det så går det inte få en procentsats med bestämt antal decimaler.
echo "scale=3;2/3*100" | bc -l
ger 66.600
Jag vill få det till 66.6%, 3.4% osv.
Vad jag vill ha är alltså en procentsats avrundat (inte kapat) till 1 decimal.
Ditt sed exempel förstår jag inte riktigt.
Mitt sed exempel är samma sak som att använda scale=, bara jag som är lite korkad och inte tänkte på scale= :P
Kod:
var=$(echo "scale=3; (2/3)*100" |bc -l|sed -e "s/\([0-9]\+\.[0-9]\).*$/\1/")
echo "$var%"
Ger nog ungefär resultatet du letar efter.
sed:en gör följande:
[0-9]\+\. letar efter 1 eller flera nummer mellan 0 till 9 fram tills den stöter på tecknet "."
[0-9] letar efter 1 nummer mellan 0-9
\( \) säger bara att buffra det som står emellan och skapa variabeln \1
.*$ är allt efter den första decimalen, för att du ska bli av med resten :P
Det är ju inte det bästa sättet att göra detta på antar jag, men det är det jag kom på lite snabbt... om du ska använda det för en one-liner eller i ett script som inte ska göra något avancerat eller särskilt ofta så är det nog ganska okey att använda den... men ska du ha något som rullar hela tiden så skulle jag nog försöka hitta nån annan lösning :P
Det inget av dessa gör är att runda talet... Bash är inte byggt för att hantera floating point beräkningar så dom flesta applikationerna runt det handskas inte särskilt bra med det heller... så jag tror du får leva med en 1/10's felmarginal. Om ingen annan har en helt brilliant lösning med builtin shell funktioner :P