算術運算
一、bash中的算術運算:help let
+, -, *, /, %取模(取餘), **(乘方)
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –ivar= 數值
(6) echo ‘算術表達式’ | bc
二、乘法符號有些場景中須要轉義,如*
三、bash有內建的隨機數生成器:
$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之間隨機數
賦值
一、加強型賦值:
+=, -=, *=, /=, %=
二、let varOPERvalue
例如:let count+=3
自加3後自賦值
三、自增,自減:
let var+=1
let var++
let var-=1
let var--
邏輯運算
一、true, false
1, 0
二、與:(&)
1 與1 = 1
1 與0 = 0
0 與1 = 0
0 與0 = 0
------------------------------------
與運算能夠理解爲而且的關係
1表明真
0表明假
一個真和一個假與的結果是假
有一個假的與出來的結果就是假的
得出結論:
誰和1與的保留原值
和0與的無論是什麼結果都是0
------------------------------------
三、或:(|)
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 = 0
! 0 = 1
二、短路運算
短路與 (&&)
第一個爲0,結果一定爲0
第一個爲1,第二個必需要參與運算
短路或 (||)
第一個爲1,結果一定爲1
第一個爲0,第二個必需要參與運算
三、異或:^
異或的兩個值,相同爲假,不一樣爲真
------------------------------------------
示例:判斷一個文件是否存在,若是存在就給文件加上執行權限
一、文件存在時。後續命令繼續執行
[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
二、文件不存在時。後續命令就再也不執行了
[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
------------------------------------------
條件測試
一、判斷某需求是否知足,須要由測試機制來實現
專用的測試表達式須要由測試命令輔助完成測試過程
二、評估布爾聲明,以便用在條件性執行中
•若真,則返回0
•若假,則返回1
三、測試命令:
•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命令
一、長格式的例子:
test "$A"="$B"&&echo"Stringsareequal"
test「$A」-eq「$B」&&echo"Integersareequal"
二、簡寫格式的例子:
["$A"="$B"]&&echo"Stringsareequal"
["$A"-eq"$B"]&&echo"Integersareequal"
bash的數值、字符串測試
一、-v VAR
變量VAR是否設置
二、數值測試:
-gt是否大於
-ge是否大於等於
-eq是否等於
-ne是否不等於
-lt是否小於
-le是否小於等於
三、字符串測試:
=是否等於
>ascii碼是否大於ascii碼
<是否小於
!=是否不等於
=~左側字符串是否可以被右側的PATTERN所匹配
注意: 此表達式通常用於[[ ]]中;擴展的正則表達式
-z "STRING「字符串是否爲空,空爲真,不空爲假
-n "STRING「字符串是否不空,不空爲真,空爲假
四、注意:用於字符串比較時的用到的操做數都應該使用引號
Bash的文件測試
一、存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在爲真,不然爲假
二、存在性及類別測試
-b FILE:是否存在且爲塊設備文件
-c FILE:是否存在且爲字符設備文件
-d FILE:是否存在且爲目錄文件
-f FILE:是否存在且爲普通文件
-h FILE 或-L FILE:存在且爲符號連接文件
-p FILE:是否存在且爲命名管道文件
-S FILE:是否存在且爲套接字文件
三、文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
四、文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
五、文件大小測試:
-s FILE: 是否存在且非空
六、文件是否打開:
-t fd: fd文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取以後是否被修改過
-O FILE:當前有效用戶是否爲文件屬主
-G FILE:當前有效用戶是否爲文件屬組
七、雙目測試:
FILE1 -efFILE2: FILE1是不是FILE2的硬連接
FILE1 -ntFILE2: FILE1是否新於FILE2(mtime)
FILE1 -otFILE2: FILE1是否舊於FILE2
Bash的組合測試條件
一、第一種方式:
COMMAND1 && COMMAND2 而且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
二、第二種方式:
EXPRESSION1 -a EXPRESSION2 而且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行