shell 指令碼程式設計之算術運算子

2021-08-04 18:06:42 字數 3580 閱讀 5944

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 將把變數 ...