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
1200001100
num2
400000100
num1<<1
2400011000
num1>>2
300000011
~num1
-1311110011
num1&num2
400000100
num1|num2
1200001100
num1^num2
800001000
取反那裡比較難理解,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
[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
[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
shell程式設計之運算子
shell變數是弱型別的,且預設是字串型,所以預設情況下無法進行數值計算。解決方法如下 命令格式 declare 選項 變數名 選項 給變數設定型別屬性 取消變數的型別屬性 a 將變數宣告為陣列型 i 將變數宣告為整數型 integer x 將變數宣告為環境變數 r 將變數宣告為唯讀變數 p 顯示指...
shell程式設計之運算子
a declare i cc aa bb.會將cc宣告為整形。作的是加法運算 b declare x test 123 會將變變數宣告為環境變數。export實際也是呼叫的該命令。c declare p test 檢視當前test變數的定義格式 d declare r test 將test變數設定為...
shell 算術運算子
下表列出了常用的算術運算子,假定變數 a 為 10,變數 b 為 20 運算子說明舉例 加法 expr a b 結果為 30。減法 expr a b 結果為 10。乘法 expr a b 結果為 200。除法 expr b a 結果為 2。取餘 expr b a 結果為 0。賦值 a b 將把變數 ...