1. 程式人生 > 實用技巧 >shell之條件判斷

shell之條件判斷

一、條件判斷語法結構

1.1 條件判斷語法格式

  • 格式1:test 條件表示式
  • 格式2: [ 條件表示式 ]
  • 格式3: [[ 條件表示式 ]]

注意:如何使用格式2或格式3,條件表示式兩側必須有空格!

1.2 條件判斷相關引數

1)判斷檔案型別
判斷引數 含義
-e 判斷檔案是否存在(任何型別檔案)
-f 判斷檔案是否存在並且是一個普通檔案
-d 判斷檔案是否存在並且是一個目錄
-L 判斷檔案是否存在並且是一個軟連線檔案
-b 判斷檔案是否存在並且是一個塊裝置檔案
-S 判斷檔案是否存在並且是一個套接字檔案
-c 判斷檔案是否存在並且是一個字元裝置檔案
-p 判斷檔案是否存在並且是一個命名管道檔案
-s 判斷檔案是否存在並且是一個非空檔案(有內容)

舉例:

$ test -e file;echo $?					只要檔案存在條件為真
$ [ -d /shell01/dir1 ];echo $?		 	判斷目錄是否存在,存在條件為真
$ [ ! -d /shell01/dir1 ];echo $?		判斷目錄是否存在,不存在條件為真
$ [[ -f /shell01/1.sh ]];echo $?		判斷檔案是否存在,並且是一個普通的檔案
2)判斷檔案許可權
判斷引數 含義
-r 當前使用者對其是否可讀
-w 當前使用者對其是否可寫
-x 當前使用者對其是否可執行
-u 是否有suid,高階許可權冒險位
-g 是否sgid,高階許可權強制位
-k 是否有t位,高階許可權粘滯位
3)判斷檔案新舊
判斷引數 含義
file1 -nt file2 比較file1是否比file2新
file1 -ot file2 比較file1是否比file2舊
file1 -ef file2 比較是否為同一個檔案,或者用於判斷硬連線,是否指向同一個inode

說明:這裡的新舊指的是檔案的修改時間!

4)判斷整數
判斷引數 含義
-eq 相等
-ne 不等
-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於
5)判斷字串
判斷引數 含義
-z 判斷是否為空字串,字串長度為0則成立
-n 判斷是否為非空字串,字串長度不為0則成立
string1 = string2 判斷字串是否相等
string1 != string2 判斷字串是否相不等
6)多重條件判斷
判斷符號 含義 舉例
-a 和 && 邏輯與 [ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 || 邏輯或 [ 1 -eq 1 -o 1 -ne 1 ]

說明:

  • &&:前面的表示式為真,才會執行後面的程式碼;
  • ||:前面的表示式為假,才會執行後面的程式碼;
  • ;:只用於分割命令或表示式;

舉例:

  • 數值比較
$ [ $(id -u) -eq 0 ] && echo "the user is admin"
[root@localhost ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin"
[root@localhost ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"
  • 類c風格的數值比較
注意:在(( ))中,=表示賦值;==表示判斷
$ ((1==2));echo $?
$ ((1<2));echo $?
$ ((2>=1));echo $?
$ ((2!=1));echo $?
$ ((`id -u`==0));echo $?

$ ((a=123));echo $a
$ ((a==123));echo $?
  • 字串比較
$ a=hello;b=world
$ [ $a = $b ];echo $?
$ [ "$a" = "$b" ];echo $?
$ [ "$a" != "$b" ];echo $?
$ [ "$a" == "$b" ];echo $?

邏輯運算子總結
1)符號;和&&和||都可以用來分割命令或者表示式;
2)分號(;)完全不考慮前面的語句是否正確執行,都會執行;號後面的內容;
3)&&符號,需要考慮&&前面的語句的正確性,前面語句正確執行才會執行&&後的內容;反之亦然;
4)||符號,需要考慮||前面的語句的非正確性,前面語句執行錯誤才會執行||後內容;反之亦然;
5)如果&&和||一起出現,從左往右依次看,按照以上原則;

二、流程控制語句

2.1 基本語法結構

1)單分支if結構
if  條件測試操作
then
	命令序列
fi	

2)雙分支if結構
if  條件測試操作
then
	命令序列
else
	命令序列
fi	

3)多分支if結構
if  條件測試操作1
then
	命令序列1
elif  條件測試操作2
then
	命令序列2
else
	命令序列3
fi	

4)多層巢狀if結構
if  條件測試操作1
then
	命令序列1
	if  條件測試操作2
	then
		命令序列2
	fi
else
	if  條件測試操作3
	then
		命令序列3
	elif  條件測試4
	then
		命令序列4
	else
		命令序列5
	fi
fi	

2.2 應用示例

1)判斷兩臺主機是否可以通訊
#!/bin/bash

# 互動式定義變數,讓使用者自己決定ping哪個主機
read -p "請輸入你要ping的主機的IP:" ip

# 使用ping程式判斷主機是否互通
ping -c1 $ip &>/dev/null

if [ $? -eq 0 ];then
    echo "當前主機和遠端主機$ip是互通的"
 else
    echo "當前主機和遠端主機$ip不通的"
fi
2)判斷一個程序是否存在
#!/bin/bash
# 判斷一個程式(httpd)的程序是否存在
pgrep httpd &>/dev/null
if [ $? -ne 0 ];then
    echo "當前httpd程序不存在"
else
    echo "當前httpd程序存在"
fi

pgrep命令:以名稱為依據從執行程序佇列中查詢程序,並顯示查詢到的程序id!
選項:
-o:僅顯示找到的最小(起始)程序號;
-n:僅顯示找到的最大(結束)程序號;
-l:顯示程序名稱;
-P:指定父程序號;pgrep -p 4764 檢視父程序下的子程序id
-g:指定程序組;
-t:指定開啟程序的終端;
-u:指定程序的有效使用者ID。

3)判斷一個服務是否正常
#!/bin/bash
#定義變數
web_server=www.baidu.com
#訪問網站
wget -P /shell/ $web_server &>/dev/null
[ $? -eq 0 ] && echo "當前網站服務是ok" && rm -f /shell/index.* || echo "當前網站>服務不ok,請立刻處理"