shell之條件判斷

2022-06-12 01:39:07 字數 4460 閱讀 5531

目錄

二、流程控制語句

2.2 應用示例

1.1 條件判斷語法格式

注意:如何使用格式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"

注意:在(( ))中,=表示賦值;==表示判斷

$ ((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

命令序列

2)雙分支if結構

if  條件測試操作

then

命令序列

else

命令序列

3)多分支if結構

if  條件測試操作1

then

命令序列1

elif 條件測試操作2

then

命令序列2

else

命令序列3

4)多層巢狀if結構

if  條件測試操作1

then

命令序列1

if 條件測試操作2

then

命令序列2

fielse

if 條件測試操作3

then

命令序列3

elif 條件測試4

then

命令序列4

else

命令序列5

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)的程序是否存在

echo "當前httpd程序不存在"

else

echo "當前httpd程序存在"

fi

pgrep命令:以名稱為依據從執行程序佇列中查詢程序,並顯示查詢到的程序id!

選項:-o:僅顯示找到的最小(起始)程序號;

-n:僅顯示找到的最大(結束)程序號;

-l:顯示程序名稱;

-p:指定父程序號;pgrep -p 4764 檢視父程序下的子程序id

-g:指定程序組;

-t:指定開啟程序的終端;

-u:指定程序的有效使用者id。

3)判斷乙個服務是否正常
#!/bin/bash

#定義變數

#訪問**

wget -p /shell/ $web_server &>/dev/null

[ $? -eq 0 ] && echo "當前**服務是ok" && rm -f /shell/index.* || echo "當前**》服務不ok,請立刻處理"

Shell條件判斷

b file 若檔案存在且是乙個塊特殊檔案,則為真 c file 若檔案存在且是乙個字元特殊檔案,則為真 d file 若檔案存在且是乙個目錄,則為真 e file 若檔案存在,則為真 f file 若檔案存在且是乙個規則檔案,則為真 g file 若檔案存在且設定了sgid位的值,則為真 h fi...

Shell 條件判斷

傳統if 從句子 以條件表示式作為 if條件 if 條件表示式 then command command command else command command fi條件表示式 檔案表示式 if f file 如果檔案存在 if d 如果目錄存在 if s file 如果檔案存在且非空 if r ...

Shell條件判斷

1 字串判斷 str1 str2 當兩個串有相同內容 長度時為真 str1 str2 當串str1和str2不等時為真 n str1 當串的長度大於0時為真 串非空 z str1 當串的長度為0時為真 空串 str1 當串str1為非空時為真 2 數字的判斷 int1 eq int2 兩數相等為真 ...