天天看點

shell腳本程式設計中的算術和邏輯運算及條件測試語句實作邏輯判斷

一、算術運算

​shell 支援算術運算,但隻支援整數,不支援小數

bash中的算術運算:

+

-

*

​/

% 取模,即取餘數,示例:9%4=1,5%3=2

** 乘方

實作算術運算

​(1) let var=算術表達式

(2) ((var=算術表達式)) 和上面等價

(3) var=$[算術表達式]

(4) var=$((算術表達式))

(5) var=$(expr arg1 arg2 arg3 ...)

(6) declare –i var = 數值

(7) echo '算術表達式' | bc

内建的随機數生成器變量:

$RANDOM   取值範圍:0-32767

​#生成 0 - 49 之間随機數

echo $[$RANDOM%50]

#随機字型顔色

[root@centos8 ~]#echo -e "\033[1;$[RANDOM%7+31]hello\033[0m"

magedu

​二、邏輯運算

​true, false ,1是對,0是錯

1, 0

與:&:和0相與,結果為0,和1相與,結果保留原值

1 與 1 = 1

1 與 0 = 0

0 與 1 = 0

0 與 0 = 0

或:|:和1相或結果為1,和0相或,結果保留原值

​1 或 1 = 1

1 或 0 = 1

0 或 1 = 1

0 或 0 = 0

非:!

​! 1 = 0 ! true

! 0 = 1 ! false

異或的兩個值,相同為假,不同為真。兩個數字X,Y異或得到結果Z,Z再和任意兩者之一X異或,将得出

另一個值Y

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

​[root@centos8 ~]#x=10;y=20;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y

x=20,y=10

三、短路運算

​短路運算

短路與

CMD1 短路與 CMD2

第一個CMD1結果為真 (1),第二個CMD2必須要參與運算,才能得到最終的結果第一個

CMD1結果為假 (0),總的結果必定為0,是以不需要執行CMD2

短路或

CMD1 短路或 CMD2

第一個CMD1結果為真 (1),總的結果必定為1,是以不需要執行CMD2

第一個CMD1結果為假 (0),第二個CMD2 必須要參與運算,,才能得到最終的結果

四、條件測試指令

​條件測試:判斷某需求是否滿足,需要由測試機制來實作,專用的測試表達式需要由測試指令輔助完成

測試過程

,實作評估布爾聲明,以便用在條件性環境下進行執行

若真,則狀态碼變量 $? 傳回0

若假,則狀态碼變量 $? 傳回1

條件測試指令

test EXPRESSION

[ EXPRESSION ] #和test 等價,建議使用 [ ]

[[ EXPRESSION ]]

注意:EXPRESSION前後必須有空白字元

變量測試:

​#判斷 NAME 變量是否定義跟   #test NAME 等價

[ -v NAME ]

#判斷 NAME 變量是否定義并且是名稱引用,bash 4.4新特性

[ -R NAME ]

#注意 [ ] 需要空格,否則會 報下面錯誤

數值測試;

​​-eq 是否等于

-ne 是否不等于

-gt 是否大于

-ge 是否大于等于

-lt 是否小于

-le 是否小于等于

範例:

​[root@centos8 ~]#i=10

[root@centos8 ~]#j=8

[root@centos8 ~]#[ $i -lt $j ]

[root@centos8 ~]#echo $?

1

[root@centos8 ~]#[ $i -gt $j ]

[root@centos8 ~]#[ i -gt j ]

-bash: [: i: integer expression expected

字元串測試:

​test和 [ ]用法

-z STRING 字元串是否為空,沒定義或空為真,不空為假,

-n STRING 字元串是否不空,不空為真,空為假

  STRING   同上

STRING1 = STRING2 是否等于,注意 = 前後有空格

STRING1 != STRING2 是否不等于

> ascii碼是否大于ascii碼

< 是否小于

[[]] 用法,建議,當使用正規表達式或通配符使用,一般情況使用 [ ]

== 左側字元串是否和右側的​PATTERN相同

注意:此表達式用于[[ ]]中,PATTERN為通配符

=~ 左側字元串是否能夠被右側的正則​表達式的PATTERN所比對

注意: 此表達式用于[[ ]]中;擴充的正規表達式

#結論:#結論:[[ == ]] == 右側的 * 做為通配符,不要加“”,隻想做為*, 需要加“” 或轉義

​檔案測試:

1、檔案存在性測試​

​​-a FILE:同 -e

-e FILE: 檔案存在性測試,存在為真,否則為假

-b FILE:是否存在且為塊裝置檔案

-c FILE:是否存在且為字元裝置檔案

-d FILE:是否存在且為目錄檔案

-f FILE:是否存在且為普通檔案

-h FILE 或 -L FILE:存在且為符号連結檔案

-p FILE:是否存在且為命名管道檔案

-S FILE:是否存在且為套接字檔案

​2、檔案權限測試

​-r FILE:是否存在且可讀

-w FILE: 是否存在且可寫

-x FILE: 是否存在且可執行

-u FILE:是否存在且擁有suid權限

-g FILE:是否存在且擁有sgid權限

-k FILE:是否存在且擁有sticky權限

注意:最終結果由使用者對檔案的實際權限決定,而非檔案屬性決定

3、檔案屬性測試

​-s FILE #是否存在且非空

-t fd #fd 檔案描述符是否在某終端已經打開

-N FILE #檔案自從上一次被讀取之後是否被修改過

-O FILE #目前有效使用者是否為檔案屬主

-G FILE #目前有效使用者是否為檔案屬組

FILE1 -ef FILE2 #FILE1是否是FILE2的硬連結

FILE1 -nt FILE2 #FILE1是否新于FILE2(mtime)

FILE1 -ot FILE2 #FILE1是否舊于FILE2

​關于 () 和 {}

​(CMD1;CMD2;...)和 { CMD1;CMD2;...; } 都可以将多個指令組合在一起,批量執行

( list ) 會開啟子shell,并且list中變量指派及内部指令執行後,将不再影響後續的環境, 幫助參看:man bash

搜尋(list)

{ list; } 不會啟子shell, 在目前shell中運作,會影響目前shell環境, 幫助參看:man bash 搜尋{ list; }

範例:

#()會開啟子shell

[root@centos8 ~]#echo $BASHPID

1920

[root@centos8 ~]#( echo $BASHPID;sleep 100)

1979

[root@centos8 ~]#pstree -p

├─sshd(719)───sshd(1906)───sshd(1919)─┬─bash(1920)───bash(1979)───sleep(1980)

#{ } 不會開啟子shell

[root@centos8 ~]#{ echo $BASHPID; }

五、組合條件測試

第一種方式[]:

[ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,結果才為真

[ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2隻要有一個真,結果就為

[ ! EXPRESSION ] 取反

​說明: -a 和 -o 需要使用測試指令進行,[[ ]] 不支援

第二種方式[[]]:

COMMAND1 && COMMAND2 #并且,短路與,代表條件性的AND THEN
如果COMMAND1 成功,将執行COMMAND2,否則,将不執行COMMAND2
COMMAND1 || COMMAND2 #或者,短路或,代表條件性的OR ELSE

繼續閱讀