一、算術運算
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