整數測試 字符測試 文件測試條件測試類型
條件測試的表達式
有三種
[ expression ] --方括號與表達式之間一定要有一個空格
[[ expression ]]
test expression
整數測試
-eq: 測試兩個整數是否相等 例:$A -eq $B
-ne: 測試兩個整數是否不等 不等為真,相等為假
-gt: 測試一個數是否大於另一個數;大於,為真;否則,為假;
-lt: 測試一個數是否小於另一個數;小於,為真;否則,為假;
-ge: 大於或等於
-le: 小於或等於
命令的間邏輯關系
邏輯與: &&
第一個條件為假時,第二條件不用再判斷;
第一個條件為真時,第二條件必須得判斷;
邏輯或: ||
第一個條件為假時,第二條件必須得判斷;
第一個條件為真時,第二條件不用再判斷;
例:比較兩個數大小
[root@iZ28g26851kZ ~]# A=12
[root@iZ28g26851kZ ~]# B=15
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比較大" || echo "B比較大"
B比較大
[root@iZ28g26851kZ ~]# A=20
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比較大" || echo "B比較大"
A比較大
[root@iZ28g26851kZ ~]#
如果A大於B則[ $A -gt $B ] 為真,需要執行(判斷)echo "A比較大"
最終[ $A -gt $B ] && echo "A比較大" 為真,所以不用再執行echo "B比較大"
if語句
——–單分支
if 判斷條件 ;then
statement1
...
fi
——–雙分支
if 判斷條件 ;then
statement1
...
else
statement2
...
fi
——–多分支
if 判斷條件 ;then
statement1
...
elif 判斷條件2 ; then
statement2
...
elif 判斷條件3 ; then
statement3
...
else
statement4
...
fi
例:判斷用戶user1是否存在,存在顯示用戶已存在,不存在則創建用戶,密碼和用戶名相同
adduser.sh
#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
echo "用戶已存在"
else
echo "當前一共有用戶`wc -l /etc/passwd | cut -d" " -f1`人"
echo "用戶不存在,正在創建用戶"
useradd $NAME
echo $NAME | passwd --stdin $NAME &> /dev/null
echo "當前一共有用戶`wc -l /etc/passwd | cut -d" " -f1`人"
fi
執行結果
[root@iZ28g26851kZ ~]# ./adduser.sh
當前一共有用戶30人
用戶不存在,正在創建用戶
當前一共有用戶31人
[root@iZ28g26851kZ ~]# ./adduser.sh
用戶已存在
[root@iZ28g26851kZ ~]#
算數運算
之前說了,shell中默認所有變量都是字符串,所以要進行算數運算就必須用命令處理
let
let 算數運算表達式
例:
[root@iZ28g26851kZ ~]# b=23
[root@iZ28g26851kZ ~]# a=12
[root@iZ28g26851kZ ~]# let c=$a+$b
[root@iZ28g26851kZ ~]# echo $c
35
[root@iZ28g26851kZ ~]#
$[算數運算表達式]
例:
[root@iZ28g26851kZ ~]# c=$[$a+$b*2]
[root@iZ28g26851kZ ~]# echo $c
58
[root@iZ28g26851kZ ~]#
$((算數運算表達式))
例:
[root@iZ28g26851kZ ~]# c=$(($a*2+$b*2))
[root@iZ28g26851kZ ~]# echo $c
70
[root@iZ28g26851kZ ~]#
expr
expr 一般用於整數運算,會自動取整,小數點後面的直接去掉
且 運算數與運算符號之間一個要有一個空格,如果沒有空格就會像下面這樣
[root@iZ28g26851kZ ~]# expr 10/3
10/3
[root@iZ28g26851kZ ~]#
原樣輸出了,,所以必須要加上空格
例:
[root@iZ28g26851kZ ~]# expr 10 / 3
3
[root@iZ28g26851kZ ~]# expr 10 + 3
13
[root@iZ28g26851kZ ~]# expr 10 - 3
7
[root@iZ28g26851kZ ~]# expr 10 * 3
expr: syntax error
可以看出,加,減,除,都沒有問題,唯獨乘法運算時居然說語法錯誤,
好吧,這裡expr應該是吧 * 當匹配字符用了,所以需要轉義一下
[root@iZ28g26851kZ ~]# expr 10 \* 3
30
ok,這樣就搞定了
文件測試
-e FILE: 測試文件是否存在
-f FILE: 測試文件是否為普通文件
-d FILE: 測試指定路徑是否為目錄
-r FILE: 測試當前用戶對指定文件是否有讀取權限
-w FILE: 測試當前用戶對指定文件是否有寫入權限
-x FILE: 測試當前用戶對指定文件是否有執行權限
例:判斷一個文件是否存在,存在則顯示其行數
#!/bin/bash
FILENAME=/etc/passwd
if [ -e $FILENAME ]; then
echo "文件存在"
echo "文件一共有` wc -l $FILENAME | cut -d" " -f1`行"
else
echo "文件不存在"
fi
如何中途退出腳本
在需要退出的地方使用exit #即可,#號為一個退出狀態(0-255的一個數值)。
0:表示腳本執行成功
1-255:表示執行失敗
也可以什麼都不返回,腳本會默認返回上一條結果的執行狀態
例:
exittest.sh
#!/bin/bash
echo "第一行"
echo "第二行"
exit 18
echo "第三行"
執行結果
[root@iZ28g26851kZ ~]# ./exittest.sh
第一行
第二行
[root@iZ28g26851kZ ~]# echo $?
18
[root@iZ28g26851kZ ~]#
顯示執行腳本的過程
有些時候,當腳本太長,出錯之後無法快速找到原因,可以使用 bash -x xxx.sh來執行腳本,該命令可將腳本執行的過程顯示出來
例:判斷文件是否存在
filetest.sh
#!/bin/bash
#
FILENAME=/etc/passwd
if [ -e $FILENAME ];then
echo "文件存在"
else
echo "文件不存在"
fi
執行
[root@iZ28g26851kZ ~]# bash -x filetest.sh
+ FILENAME=/etc/passwd
+ '[' -e /etc/passwd ']'
+ echo $'\346\226\207\344\273\266\345\255\230\345\234\250'
文件存在
[root@iZ28g26851kZ ~]#
這樣就可以很方便的檢查腳本了