條件判斷語句 if case

sarynsuo發表於2021-01-03

條件測試操作

Shell環境根據命令執行後的返回狀態值( ? ) 來 判 斷 是 否 執 行 成 功 , 當 返 回 值 為 0 ( 真 t r u e ) 時 表 示 成 功 , 返 回 值 為 非 0 值 ( 假 f a l s e ) 時 表 示 失 敗 或 異 常 。 t e s t 命 令 , 可 以 對 特 定 條 件 進 行 測 試 , 並 根 據 返 回 值 來 判 斷 條 件 是 否 成 立 ( ?)來判斷是否執行成功,當返回值為0(真true)時表示成功,返回值為非0值(假false)時表示失敗或異常。 test 命令,可以對特定條件進行測試,並根據返回值來判斷條件是否成立( ?0true0falsetest?返回值為 0 表示條件成立)。
格式一:test 條件表示式
格式二:[ 條件表示式 ] #方括號“[”或“]”與條件表示式之間需要至少一個空格進行分隔

檔案測試

格式:[ 操作符 檔案或目錄 ]

常用的操作符:
-e:測試目錄或檔案是否存在(Exist)。
-d:測試是否為目錄(Directory)。
-f:測試是否為檔案(File)。
-r:測試當前使用者是否有許可權讀取(Read)。
-w:測試當前使用者是否有許可權寫入(Write)。
-x:測試是否設定有可執行(Excute)許可權。

整數值比較

格式:[ 整數變數1 操作符 整數變數2 ]

常用的操作符:
-eq:等於 ==
-ne:不等於 !=
-gt:大於 >
-lt:小於 <
-le:小於等於
-ge:大於等於

字串比較

格式1:
[ 字串1 = 字串2 ] 或 [ 字串1 == 字串2 ]
[ 字串1 != 字串2 ]

格式2:
[ -z 字串 ] #檢查字串是否為空(Zero),對於未定義或賦予空值的變數將視為空串
[ -n 字串 ] #檢查是否有字串存在

邏輯測試

格式1:[ 表示式1 ] 操作符 [ 表示式2 ]
格式2:命令1 操作符 命令2

常用的操作符:
-a或&& :邏輯與,“而且”的意思,前後條件需都成立
-o或|| :邏輯或,“或者”的意思,只需前後條件中一個成立
! :邏輯否

a=5
[ $a -ne 1 ] && [ $a != 2 ] 等同於 [ $a -ne 1 -a $a != 2 ]

#&&、||操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯
[[ $a != 1 && $a != 2 ]]

[[ 2 ­lt 3 ]] && echo true || false

[[ 2 ­ge 3 ]] && echo true || false

vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null && echo "$1 online" || echo "$1 off"

-c:傳送包的個數
-i:傳送包的間隔時間
-W:超時時間
-w:多少秒後停止 ping 命令操作

if語句
單分支 if 語句

if 條件測試操作
then
命令序列
fi

【1】
if [ 3 -gt 2 ]
then
echo “ok”
fi

【2】
if [ 3 -gt 2 ]; then echo “ok”; fi

【3】
[ 3 -gt 2 ] && echo “ok”

雙分支 if 語句

if 條件測試操作
then
命令序列 1
else
命令序列 2
fi

vim pinghost1.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null
if [ $? -eq 0 ]
then
	echo "$1 online"
else
	echo "$1 off"
fi

多分支 if 語句

if 條件測試操作 1
then
命令序列 1
elif 條件測試操作 2
then
命令序列 2
[else]
[命令序列 3]
fi

vim score.sh
#!/bin/bash
read -p "請輸入您的分數(0-100): " score
if [ $score -ge 85 ] && [ $score -le 100 ]
then
	echo "$score 分,優秀!"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
	echo "$score 分,合格!"
else
	echo "$score 分,不合格!"
fi

case 語句

case 變數值 in

模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
……

  • )
    預設命令序列
    esac
vim score1.sh
#!/bin/bash
read -p "請輸入您的分數(0-100): " score
[[ $score -ge 85 && $score -le 100 ]] && a="great"
[[ $score -ge 70 && $score -lt 85 ]] && a="standard"
[[ $score -ge 0 && $score -lt 70 ]] && a="false"
case $score in
great)
	echo "$score 分,優秀!"
;;
standard)
	echo "$score 分,合格!"
;;
false)
	echo "$score 分,不合格!"
;;
*)
	echo "輸入有誤!"
esac


vim /etc/init.d/firewalld
case $1 in
start)
	systemctl start firewalld.service
;;
stop)
	systemctl stop firewalld.service
;;
restart)
	$0 stop
	$0 start
;;
status)
	systemctl status firewalld.service
;;
* )
	echo "用法: $0 {start|stop|status|restart}"
esac

相關文章