Abstract :
css
1) Linux shell 中使用 let , [ ] ,(( )) 三種運算符操做 shell 變量進行簡單的基本運算;
2)Linux shell 中使用 expr 與 bc 兩個程序實現高級運算;
1, Linux shell 變量的基本運算
shell
數值做爲常規變量直接賦值給變量,而且以字符串形式保存。
1.1 let 命令能夠用於直接執行基本操做:
當我使 用 let 的時候,咱們不使用 $ 符號引用變量。
no1=7;
expressno2=8;
ide
echo "------------ let command -------------"
函數let no1++;
spalet no2--;
ormlet no1+=3;
字符串let no2-=5;
數學let result=no1+no2;
itprintf "let result=%d\n" $result;
![]()
1.2 " [ ] "運算符跟 let 命令很類似:
"[ ]" 運算符裏面能夠使用 $ 符號引用變量,同時支持變量名與運算符之間不帶空格。
echo "----------------- [] operator ----------------"
printf "no1:%d no2:%d \n" $no1 $no2;
result1=$[ no1 + no2 ];
printf "result1 = %d \n" $result1;
result2=$[no1+no2 + 7];
printf "result2 = %d \n" $result2;
result3=$[ $no1+$no2+5 ];
printf "result3 = %d \n" $result3;
no2=$[ no2 + 1 ];
printf "no1 = %d no2 = %d \n" $no1 $no2;
1.3 " (( )) " 運算符跟 " [ ] " 運算符同樣:
一樣支持使用 $ 符號引用變量進行基本運算,同時支持變量名與運算符之間不帶空格。
echo "----------------- (( )) operator --------------"
printf "no1: %d no2: %d \n" $no1 $no2;
result1=$(( no1 + no2 ));
printf "result1 = %d \n" $result1;
result2=$((no1+no2+3));
printf "result2 = %d \n" $result2;
result3=$(( $no1+$no2 + 5))
printf "result3 = %d \n" $result3;
![]()
1.4 "expr" 命令一樣能夠用於變量的基本運算:
"expr" 命令一樣支持 $ 符號引用變量進行基本運算,可是變量與運算符之間必須使用空格做爲分隔符;
在使用 "expr" 命令對變量進行運算後,整個表達式必須使用 " · expression · " 的模式賦值給變量,即包含在 " ` "符裏面,
而且等效於 " $( expression ) " 模式。
echo "---------------- expr command ---------------"
printf "no1: %d no2: %d \n" $no1 $no2;
result1=`expr 3 + 4`;
printf "result1 = %d \n" $result1;
result2=`expr $no1 + 4`;
printf "result2 = %d \n" $result2;
result3=`expr $no1 + $no2`;
printf "result3 = %d \n" $result3;
result4=`expr $no1+$no2`;
printf "result4 = %d \n" $result4;
result5=$(expr $no1 + 3);
printf "result5 = %d \n" $result5;
result6=$(expr $no1+4);
printf "result6 = %d \n" $result6;
result7=$(expr $no1+$no2);
printf "result7 = %d \n" $result7;
![]()
由上圖實驗結果所示," expr " 命令的表達式中,變量與運算符之間必須使用空格做爲分隔符,
有一點我沒搞明白的就是爲何42行的表達式已經錯了,爲何在43行才報錯。
" expr " 還支持許多運算表達式,你們在終端打個 expr --help 命令看看吧,o(∩_∩)o 哈哈。。。
上面所述的四種shell中執行變量運算的方式中不支持浮點運算!
2, Linux shell 中使用 bc 命令實現高級數學運算:
bc 命令使用 標準輸入 stdin 做爲輸入;
bc 是一個支持精確的浮點運算的高級計算器;
bc 擁有至關多的輸入選項,而且支持數學函數調用;
執行 bc --help 自行查看 bc 所支持的輸入選項;
2.1 bc 命令使用標準輸入 stdin 做爲輸入,而且支持浮點運算:
echo "----------------- bc command ----------------"
echo "4 * 0.56" | bc;
no=48;
result1=`echo "$no * 1.5" | bc`;
echo "result1 = $result1";
![]()
2.2 bc 命令支持運算精度設置:
經過附加參數能夠給 bc 指定運算精度;
附加參數使用分號 " ; " 做爲分隔符;
result2=`echo "scale=9;$no / 3;" | bc`;
echo "result2 = $result2";
![]()
實驗結果所示,使用分號 " ; " 加入附加參數 scale ,指定精度爲 9 位小數;
2.3 使用 bc 進行數值的記數進制間轉換:
經過 ibase=value 做爲附加參數,指定輸入變量的記數進制;
經過 obase=value 做爲附加參數,指定輸出變量的記數進制;
no=100;
echo "echo \"obase=2;ibase=10;$no\" | bc = `echo "obase=2;ibase=10;$no" | bc`";
no=1000;
echo "echo \"scale=5;obase=10;ibase=2;$no/3\" | bc = `echo "scale=5;obase=10;ibase=2;$no/3" | bc`";
![]()
2.4 使用 bc 調用數學公式進行高級數學運算:
" sqrt(value) " 執行 value 的開方運算;
" value^index " 執行 value 的冪運算;
echo "sqrt(100) = `echo "sqrt(100)" | bc`";
echo "sqrt(100) = $(echo "sqrt(100)" | bc)";
echo "10^3 = `echo "10^3" | bc`";
echo "10^3 = $(echo "10^3" | bc)";
![]()