shell 腳本編程之算術運算符

基本算術運算符

shell 的算術運算符只支持整數,浮點數的運算結果會被轉換成整數。算術運算符包括 + - * \ % **(冪運算) += -= *= \= %= ++ – <<(位左移) >>(位右移) &(按位與) |(按位或) ^(按位異或) ~(按位非)。使用 let “expression” 的方式將運算的結果保存到變量中,如果直接寫 var=var1+var2 這種賦值方式,則得到的結果是字符串。

[ljx@localhost ~]$ num=1+2
[ljx@localhost ~]$ echo $num
1+2
[ljx@localhost ~]$ let "num=1+2"
[ljx@localhost ~]$ echo $num
3

下面寫一個腳本,測試一下各種算術運算符

#learn_opeartor.sh
#!/bin/bash
num1=10
num2=4
let "num3=$num1+$num2"
echo $num1+$num2=$num3
let "num3=num1-num2"
echo $num1-$num2=$num3
let "num3=num1/num2"
echo $num1/$num2=$num3
let "num3=num1%num2"
echo $num1%$num2=$num3
let "num3=num1**2"
echo $num1**2=$num3
let "num3+=num1"
echo +=: $num3
let "num3-=num2"
echo -=: $num3
let "num3%=num2"
echo %=: $num3
let "num3=num1++"
echo num1++: $num3
let "num3=++num1"
echo ++num1: $num3

let "num3=num1<<1"
echo 左移一位 $num3
let "num3=num1>>2"
echo 右移兩位 $num3
let "num3=~num1"
echo 按位取反 $num3
let "num3=num1&num2"
echo 按位與 $num3
let "num3=num1|num2"
echo 按位或 $num3
let "num3=num1^num2"
echo 按位異或 $num3

執行結果

10+4=14
10-4=6
10/4=2
10%4=2
10**2=100
+=: 110
-=: 106
%=: 2
num1++: 10
++num1: 12
左移一位 24
右移兩位 3
按位取反 -13
按位與 4
按位或 12
按位異或 8

在 let 字符串中的變量加不加 $ 符號都可以。前面的幾個運算很簡單,主要看看後面幾個。自增符號 ++ 和自減符號 – 要區分前綴和後綴,像例子中 num1 原來的值爲 10,num3=num1++ 爲後綴表達式,先賦值再自增,因此 num3 的值爲 10,這時 num1 的值爲 11;然後 num3=++num1 爲前綴表達式,先自減再賦值,此時 num1 的值爲 12,num3 的值也爲 12。
接下來是位運算符

變量 十進制值 二進制值
num1 12 00001100
num2 4 00000100
num1<<1 24 00011000
num1>>2 3 00000011
~num1 -13 11110011
num1&num2 4 00000100
num1|num2 12 00001100
num1^num2 8 00001000

取反那裏比較難理解,00001100 取反之後的結果是 11110011,這個結果是補碼,計算機保存的是補碼,大多數語言也是用補碼來表示數值的。根據這個補碼結果,可以推導出原碼,再根據原碼計算它的十進制數值。首先,反碼轉補碼是最後一位加一,那麼補碼轉反碼就是最後一位減一,因此根據補碼 11110011 得到反碼 11110010;然後原碼轉反碼是符號位保持不變,其它位全部取反,反碼轉原碼也一樣,因此根據反碼 11110010 得到原碼 10001101,根據這個原碼得到十進制數 -(8+4+1)=-13。

算術擴展

前面講到,要做算術運算,必須使用 let 關鍵字,然後在一個字符串中作運算並把運算結果保存到變量中。下面講幾種算術擴展的方式,可以直接作運算並賦值,還可以在 shell 中直接輸出運算結果而不需要保存到變量中。
* 使用 $[] 作運算,可以對直接量或變量進行算術運算操作

[ljx@localhost ~]$ echo $[10**3]
1000
[ljx@localhost ~]$ num=$[8>>1]
[ljx@localhost ~]$ echo $num
4
[ljx@localhost ~]$ echo $[num+2]
6
[ljx@localhost ~]$ echo $[$num*3]
12
  • 使用 $(()) 作運算,可以對直接量和變量進行算術運算操作,和 $[] 作用一樣
[ljx@localhost ~]$ num=18
[ljx@localhost ~]$ echo $((num**2))
324
[ljx@localhost ~]$ echo $(($num/18))
1
[ljx@localhost ~]$ echo $((18**2))
324
  • 使用 expr 作運算,用於在 shell 中交互作算術運算,運算符與操作數之間要用空格隔開,特殊算術運算符必須轉義,另外這種方式處理不了位運算
[ljx@localhost ~]$ expr 1+2
1+2
[ljx@localhost ~]$ expr 1 + 2
3
[ljx@localhost ~]$ expr 2 * 3
expr: syntax error
[ljx@localhost ~]$ expr 2 \* 3
6
[ljx@localhost ~]$ num=expr 1 + 2
bash: 1: command not found
  • 使用 declare 內建命令定義變量,可以顯式地把變量定義成“整數”,這樣就可以直接將算術運算的結果賦給變量了,這種方式同樣處理不了位運算
[ljx@localhost ~]$ declare -i var
[ljx@localhost ~]$ var=10/3
[ljx@localhost ~]$ echo $var
3
[ljx@localhost ~]$ var=var+5
[ljx@localhost ~]$ echo $var
8
[ljx@localhost ~]$ var=$var-10
[ljx@localhost ~]$ echo $var
-2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章