Shell腳本編程算術運算和條件測試
阿新 • • 發佈:2018-10-04
ech 符號 文件屬組 iss 如果 rand 大於等於 code 數值 算術運算
1、bash中的算術運算:help let +, -, *, /, %取模(取余), **(乘方) 實現算術運算: (1) let var=算術表達式 (2) var=$[算術表達式] (3) var=$((算術表達式)) (4) var=$(expr arg1 arg2 arg3 ...) (5) declare –ivar= 數值 (6) echo ‘算術表達式’ | bc 2、乘法符號有些場景中需要轉義,如* 3、bash有內建的隨機數生成器: $RANDOM(0-32767) echo $[$RANDOM%50] :0-49之間隨機數
賦值
1、增強型賦值:
+=, -=, *=, /=, %=
2、let varOPERvalue
例如:let count+=3
自加3後自賦值
3、自增,自減:
let var+=1
let var++
let var-=1
let var--
邏輯運算
1、true, false 1, 0 2、與:(&) 1 與1 = 1 1 與0 = 0 0 與1 = 0 0 與0 = 0 ------------------------------------ 與運算可以理解為並且的關系 1代表真 0代表假 一個真和一個假與的結果是假 有一個假的與出來的結果就是假的 得出結論: 誰和1與的保留原值 和0與的不管是什麽結果都是0 ------------------------------------ 3、或:(|) 1 或1 = 1 1 或0 = 1 0 或1 = 1 0 或0 = 0 ------------------------------------ 或運算: 真和真或結果為真 1 || 1 = 1 真和假或結果也為真 1 || 0 = 1 假和真或結果也是真 0 || 1 = 1 只有兩個為假是結果才為假 0 || 0 = 0 結論: 和真與的結果為真 和假與的保留原值 ------------------------------------
邏輯運算
1、非:! ! 1 = 0 ! 0 = 1 2、短路運算 短路與 (&&) 第一個為0,結果必定為0 第一個為1,第二個必須要參與運算 短路或 (||) 第一個為1,結果必定為1 第一個為0,第二個必須要參與運算 3、異或:^ 異或的兩個值,相同為假,不同為真 ------------------------------------------ 示例:判斷一個文件是否存在,如果存在就給文件加上執行權限 1、文件存在時。後續命令繼續執行 [root@node1 ~]#ls anaconda-ks.cfg &> /dev/null && chmod +x anaconda-ks.cfg [root@node1 ~]#ll total 1244 -rwx--x--x. 1 root root 1559 Jul 18 20:55 anaconda-ks.cfg 2、文件不存在時。後續命令就不再執行了 [root@node1 ~]#ls an &> /dev/null && chmod +x an [root@node1 ~]#echo $? 2 示例:判斷一個賬號是否存在,不存在則創建此賬號 [root@node1 ~]#id coodf &> /dev/null || useradd coodf [root@node1 ~]#echo $? 0 [root@node1 ~]#getent passwd coodf coodf:x:1004:1004::/home/coodf:/bin/bash [root@node1 ~]# 示例;用異或來兌換兩個數字的位置 [root@node1~/bin]#a=10;b=7;a=$[a^b];b=$[a^b];a=$[a^b]; echo $a $b 7 10 ------------------------------------------
條件測試
1、判斷某需求是否滿足,需要由測試機制來實現
專用的測試表達式需要由測試命令輔助完成測試過程
2、評估布爾聲明,以便用在條件性執行中
?若真,則返回0
?若假,則返回1
3、測試命令:
?test EXPRESSION
?[ EXPRESSION ]
?[[ EXPRESSION ]]
[[ EXPRESSION ]]
== 相同,字符串不要加"",支持通配符
=~ 匹配,字符串不要加"",支持擴展正則表達式
註意:EXPRESSION前後必須有空白字符
-------------------------------------------------
避免空值的寫法 加X即可
[root@node2 ~]#[ X"$name" = X"$title" ] && echo true || echo false
false
[[ ]] 變量要加"" 正則表達式不用加""
[root@node3 ~]#var=abc;[[ "$var" =~ ^a ]] && echo true|| echo false
true
判斷是否以.conf結尾
[root@node3 ~]#filename=a.conf
[root@node3 ~]#[[ "$filename" =~ \.conf$ ]] &&echo true || echo false
true
[root@node3 ~filename=a.con
[root@node3 ~[[ "$filename" =~ \.conf$ ]] && echo true || echo false
false
判斷一個是否為文件並且這個文件是否有寫權限,如果有寫權限就給它去掉
[root@node3 ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file
判斷一個是否為文件或者這個文件是否有寫權限,如果有寫權限就給它去掉
[root@node3 ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file
判斷一個文件不具有寫權限,如果沒有就給它加上寫權限
[root@node3 ~]#file=/etc/issue;[ ! -w $file ] && chmod +w $file
判斷一個文件是否具有執行權限,如果沒有就給它加上執行權限
[root@node3 ~]#file=/etc/shadow ; [ ! -x $file ] && chmod +x $file
[root@node3 ~]#ll /etc/shadow
---x--x--x 1 root root 1220 Sep 22 08:26 /etc/shadow
[root@node3 ~]#
----------------------------------------------------------
條件性的執行操作符
根據退出狀態而定,命令可以有條件地運行
?&& 代表條件性的AND THEN
?|| 代表條件性的OR ELSE
-------------------------------------
示例:
[root@node3 ~]#grep -q no_such_user /etc/passwd || echo ‘No such user‘
No such user
test命令
1、長格式的例子:
test "$A"="$B"&&echo"Stringsareequal"
test“$A”-eq“$B”&&echo"Integersareequal"
2、簡寫格式的例子:
["$A"="$B"]&&echo"Stringsareequal"
["$A"-eq"$B"]&&echo"Integersareequal"
bash的數值、字符串測試
1、-v VAR
變量VAR是否設置
2、數值測試:
-gt是否大於
-ge是否大於等於
-eq是否等於
-ne是否不等於
-lt是否小於
-le是否小於等於
3、字符串測試:
=是否等於
>ascii碼是否大於ascii碼
<是否小於
!=是否不等於
=~左側字符串是否能夠被右側的PATTERN所匹配
註意: 此表達式一般用於[[ ]]中;擴展的正則表達式
-z "STRING“字符串是否為空,空為真,不空為假
-n "STRING“字符串是否不空,不空為真,空為假
4、註意:用於字符串比較時的用到的操作數都應該使用引號
Bash的文件測試
1、存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假
2、存在性及類別測試
-b FILE:是否存在且為塊設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或-L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件
3、文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
4、文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
5、文件大小測試:
-s FILE: 是否存在且非空
6、文件是否打開:
-t fd: fd文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取之後是否被修改過
-O FILE:當前有效用戶是否為文件屬主
-G FILE:當前有效用戶是否為文件屬組
7、雙目測試:
FILE1 -efFILE2: FILE1是否是FILE2的硬鏈接
FILE1 -ntFILE2: FILE1是否新於FILE2(mtime)
FILE1 -otFILE2: FILE1是否舊於FILE2
Bash的組合測試條件
1、第一種方式:
COMMAND1 && COMMAND2 並且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
2、第二種方式:
EXPRESSION1 -a EXPRESSION2 並且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行
Shell腳本編程算術運算和條件測試