2014-12-13 47 views
1

我需要做的操作數字字符,但什麼是錯在我的代碼在bash確認變量

我有4個變量,KM1,KM2,KM3,KM4。

我要總結除了當值是「封閉」

3.200 
CLOSED 
1.800 
0.600 

當我做下面的總和,有一個錯誤的4個變量...我的東西我的變量是不是數字,任何幫助?我怎樣才能強迫他們是數字,然後做總和?

let km=$km1+$km3+$km4 
echo $km 

./sum.sh:線41:讓:公里= 3.200:語法錯誤:無效算術運算符(錯誤標記是」 0.200" )

+0

bash不支持浮動。看看[這裏](http://stackoverflow.com/a/2362611/812912) – 2014-12-13 12:46:46

+1

bash不支持浮點運算。您可以使用外部工具,例如'awk'或'bc':'km = $(echo「scale = 6; $ km1 + $ km3 + $ km4」| bc)''。您可以根據所需的小數部分調整「比例」。 – 2014-12-13 12:52:47

+0

[expr中的shell浮點數可能的重複](http://stackoverflow.com/questions/2362154/shell-float-number-in-expr) – tripleee 2014-12-13 13:15:04

回答

1
km1=3.200 
km2=CLOSED 
km3=1.800 
km4=0.600 
total=`LC_ALL=C echo "$km1 $km2 $km3 $km4"|awk '{sum += $1+$2+$3+$4}END {print sum}'` 

不與AWK好,但我認爲上述可以幫助。總共是所有變量的總和

+0

太好了!它是什麼使LC_ALL = C? – 2014-12-13 13:59:52

+0

「LC_ALL = C」在bash shell中運行命令行參數。如果您正在運行abash命令而不輸出爲awk,則可以忽略它,如果要將輸出傳遞給awk,則必須明確使用此命令,然後再使用bash命令行。 – repzero 2014-12-13 14:07:49

+1

@Enric它將該行的語言環境設置爲「C」,這可能是不必要的,除非將其設置爲其他語言(例如,歐洲語言環境使用','而不是'.'作爲浮點數)。 – 2014-12-13 14:08:58

0

有2個問題與您的代碼。第一個是你正在嘗試使用整數以外的值。 Bash只是整數。您可以使用bc(任意精度計算器語言)將值四捨五入到整數。第二個問題是你正在嘗試對字符串進行數學運算。所以考慮下面的代碼:

#!/bin/bash 

km1=3.200; 
km2="CLOSED"; 
km3=1.800; 
km4=0.600; 

km1=$(echo "$km1/1" | bc) 
km3=$(echo "$km3/1" | bc) 
km4=$(echo "$km4/1" | bc) 

array=($km1 $km2 $km3 $km4) 

for i in ${array[@]}; do 
case $i in 
*[0-9]*) 
    ((result+=$i)) 
esac 
done 

echo $result 
+1

清除意見拉維,有趣的方式,有用 – 2014-12-16 22:25:01

+0

謝謝安妮可 – 2014-12-18 04:34:01