算術運算
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
必須使用測試命令進行