Shell腳本中if條件判斷的寫(xiě)法實(shí)例
前言
if…else… 可以說(shuō)是我們?cè)诰幊讨凶畛R?jiàn)的條件判斷語(yǔ)句了,那么在 Shell 中如何使用呢?如何判斷兩個(gè)數(shù)值相等?如何判斷一個(gè)文件是否存在?跟隨這篇文章,一起來(lái)學(xué)習(xí)吧!
條件判斷格式
在 Shell 中有兩種判斷格式,分別如下:
# 1. 第一種 test ?條件判斷式 # 2. 第二種,注意括號(hào)兩端必須有空格 [ ?條件判斷式 ] ? ?
第二種方式相當(dāng)于第一種的簡(jiǎn)化。那么我們?nèi)绾沃酪粋€(gè)條件判斷語(yǔ)句是否為真呢?其實(shí)在 Bash中的變量類型,還有這兩種! 的預(yù)定義變量部分 ,我們學(xué)習(xí)過(guò)如何判斷一個(gè)命令是否執(zhí)行成功,即 $? 是否等于 0,0表示執(zhí)行成功,否則表示上個(gè)命令失敗,條件判斷也是使用這種方式。
# 查看文件列表 [root@VM-0-5-centos ~]# ls if.sh ?student.txt ?test.sh # -e 文件名,用于判斷文件是否存在 [root@VM-0-5-centos ~]# test -e if.sh [root@VM-0-5-centos ~]# echo $? 0 [root@VM-0-5-centos ~]# test -e if.ssss [root@VM-0-5-centos ~]# echo $? 1 # 換個(gè)姿勢(shì),再來(lái)測(cè)試一遍 [root@VM-0-5-centos ~]# [ -e if.sh ] [root@VM-0-5-centos ~]# echo $? 0 [root@VM-0-5-centos ~]# [ -e if.ssss ] [root@VM-0-5-centos ~]# echo $? 1
if 語(yǔ)句
- if 開(kāi)頭,fi 結(jié)尾
- [ 條件判斷 ] 就是使用 test 命令判斷,兩端必須有空格
- if 如果 和 then 在一行,需要加 ;
單分支
if [ 條件判斷式 ];then
命令
fi或者
if [ 條件判斷式 ]
then
命令
fi
雙分支
if [ 條件判斷式 ]
then
命令
else
命令
fi
多分支
if [ 條件判斷式1 ]
then
命令
elif [ 條件判斷式2 ]
then
命令
...else
命令
fi
條件判斷類型
按照文件類型進(jìn)行判斷
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| -b 文件 | 判斷該文件是否存在,并且是否為塊設(shè)備文件 |
| -c 文件 | 判斷該文件是否存在,并且是否為字符設(shè)備文件 |
| -d 文件 | 判斷該文件是否存在,并且是否為目錄文件 |
| -e 文件 | 判斷該文件是否存在 |
| -f 文件 | 判斷該文件是否存在,并且是否為普通文件 |
| -L 文件 | 判斷該文件是否存在,并且是否為符號(hào)鏈接文件 |
| -p 文件 | 判斷該文件是否存在,并且是否為管道文件 |
| -s 文件 | 判斷該文件是否存在,并且是否為空 |
| -S 文件 | 判斷該文件是否存在,并且是否為套接字文件 |
# 1. 新建一個(gè)腳本文件 [root@VM-0-5-centos ~]# vim file_test.sh #!/bin/bash read -p "please input filename: " filename if [ -e $filename ] ? then ? ? ? ? echo "yes" else ? ? ? ? echo "no" fi # 2. 添加可執(zhí)行權(quán)限 [root@VM-0-5-centos ~]# chmod 755 file_test.sh # 3. 測(cè)試執(zhí)行 [root@VM-0-5-centos ~]# ./file_test.sh please input filename: student.txt yes [root@VM-0-5-centos ~]# ./file_test.sh please input filename: falsfja no
為了測(cè)試各種判斷類型方便,我們可以直接使用如下方式測(cè)試,避免每次寫(xiě)腳本了。
# 一個(gè)命令正確執(zhí)行,輸出yes,否則輸出no [root@VM-0-5-centos ~]# [ -e student.txt ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ -e sss ] && echo 'yes' || echo 'no' no [root@VM-0-5-centos ~]# [ -d mydir/ ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ -d student.txt ] && echo 'yes' || echo 'no' no
按照文件權(quán)限進(jìn)行判斷
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| -r 文件 | 判斷該文件是否存在,并且是否擁有讀權(quán)限 |
| -w 文件 | 判斷該文件是否存在,并且是否擁有寫(xiě)權(quán)限 |
| -x 文件 | 判斷該文件是否存在,并且是否擁有執(zhí)行權(quán)限 |
[root@VM-0-5-centos ~]# [ -x file_test.sh ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ -x student.txt ] && echo 'yes' || echo 'no' no
文件之間比較
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| 文件1 -nt 文件2 | 判斷文件1的修改時(shí)間是否比文件2的新 |
| 文件1 -ot 文件2 | 判斷文件1的修改時(shí)間是否比文件2的舊 |
| 文件1 -ef 文件2 | 判斷文件1是否和文件2的Inode號(hào)一致,可以理解兩個(gè)文件是否為同一個(gè)文件。這個(gè)判斷用于判斷硬鏈接是個(gè)很好的方法。 |
# 創(chuàng)建硬鏈接后測(cè)試 [root@VM-0-5-centos ~]# ln student.txt /tmp/student.txt [root@VM-0-5-centos ~]# [ student.txt -ef /tmp/student.txt ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ student.txt -ef /tmp/stargate.lock ] && echo 'yes' || echo 'no' no
整數(shù)之間比較
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| 整數(shù)1 -eq 整數(shù)2 | 整數(shù)1是否和整數(shù)2相等 |
| 整數(shù)1 -ne 整數(shù)2 | 整數(shù)1是否和整數(shù)2不等 |
| 整數(shù)1 -gt 整數(shù)2 | 整數(shù)1是否大于整數(shù)2 |
| 整數(shù)1 -lt 整數(shù)2 | 整數(shù)1是否小于整數(shù)2 |
| 整數(shù)1 -ge 整數(shù)2 | 整數(shù)1是否大于等于整數(shù)2 |
| 整數(shù)1 -le 整數(shù)2 | 整數(shù)1是否小于等于整數(shù)2 |
[root@VM-0-5-centos ~]# [ 10 -eq 10 ] ?&& echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ 10 -gt 5 ] ?&& echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ 10 -lt 5 ] ?&& echo 'yes' || echo 'no' no
字符串的判斷
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| -z 字符串 | 字符串是否為空 |
| -n 字符串 | 字符串是否非空 |
| 字符串1 == 字符串2 | 字符串是否相等 |
| 字符串1 != 字符串2 | 字符串是否不等 |
if 判斷中對(duì)于變量的處理,需要加引號(hào),如果沒(méi)有加雙引號(hào),可能會(huì)在判斷含空格的字符串變量的時(shí)候產(chǎn)生錯(cuò)誤。
[root@VM-0-5-centos ~]# name="" # 不見(jiàn)引號(hào),判斷出的 name 是非空,其實(shí)是空 [root@VM-0-5-centos ~]# ?[ -n $name ] && echo 'yes' || echo 'no' yes # 加上引號(hào)就對(duì)了 [root@VM-0-5-centos ~]# ?[ -n "$name" ] && echo 'yes' || echo 'no' no [root@VM-0-5-centos ~]# name1=hello [root@VM-0-5-centos ~]# name2=world [root@VM-0-5-centos ~]# [ "$name1" != "$name2" ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ "$name1" == "$name2" ] && echo 'yes' || echo 'no' no
多重條件判斷
| 測(cè)試選項(xiàng) | 作用 |
|---|---|
| 判斷1 -a 判斷2 | 邏輯與 |
| 判斷1 -o 判斷2 | 邏輯或 |
| !判斷 | 邏輯非 |
[root@VM-0-5-centos ~]# a=hello [root@VM-0-5-centos ~]# [ -n "$a" -a "$a" == "hello" ] && echo 'yes' || echo 'no' yes [root@VM-0-5-centos ~]# [ -n "$a" -a "$a" == "world" ] && echo 'yes' || echo 'no' no
附:Shell if 判斷語(yǔ)句參數(shù)
[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個(gè)塊特殊文件則為真。
[ -c FILE ] 如果 FILE 存在且是一個(gè)字特殊文件則為真。
[ -d FILE ] 如果 FILE 存在且是一個(gè)目錄則為真。
[ -e FILE ] 如果 FILE 存在則為真。
[ -f FILE ] 如果 FILE 存在且是一個(gè)普通文件則為真。
[ -g FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -k FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了粘制位則為真。
[ -p FILE ] 如果 FILE 存在且是一個(gè)名字管道(F如果O)則為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則為真。
[ -s FILE ] 如果 FILE 存在且大小不為0則為真。
[ -t FD ] 如果文件描述符 FD 打開(kāi)且指向一個(gè)終端則為真。
[ -u FILE ] 如果 FILE 存在且設(shè)置了SUID (set user ID)則為真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫(xiě)的則為真。
[ -x FILE ] 如果 FILE 存在且是可執(zhí)行的則為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。
[ -L FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。
[ -S FILE ] 如果 FILE 存在且是一個(gè)套接字則為真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not則為真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則為真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設(shè)備和節(jié)點(diǎn)號(hào)則為真。
[ -o OPTIONNAME ] 如果 shell選項(xiàng) “OPTIONNAME” 開(kāi)啟則為真。
[ -z STRING ] “STRING” 的長(zhǎng)度為零則為真。
[ -n STRING ] or [ STRING ] “STRING” 的長(zhǎng)度為非零 non-zero則為真。
[ STRING1 == STRING2 ] 如果2個(gè)字符串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。
[ STRING1 != STRING2 ] 如果字符串不相等則為真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則為真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則為真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.
總結(jié)
本篇文章首先介紹了條件判斷的格式以及原理,然后介紹了 if 語(yǔ)句的格式,最后介紹了多個(gè)條件判斷類型。內(nèi)容比較多,熟能生巧,快操練起來(lái)吧!
到此這篇關(guān)于Shell腳本中if條件判斷寫(xiě)法的文章就介紹到這了,更多相關(guān)Shell腳本if條件判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Linux與Windows上獲取當(dāng)前堆棧信息的方法
下面小編就為大家?guī)?lái)一篇在Linux與Windows上獲取當(dāng)前堆棧信息的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
如何使用 Shell 腳本執(zhí)行 .NET Core 應(yīng)用
這篇文章主要介紹了如何使用 Shell 腳本執(zhí)行 .NET Core 應(yīng)用,幫助大家更好的理解和使用shell 腳本,感興趣的朋友可以了解下2020-09-09
linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫(kù)備份
本文主要介紹了Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫(kù)備份,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
shell實(shí)現(xiàn)SSH自動(dòng)登陸的方法示例
這篇文章主要介紹了shell實(shí)現(xiàn)SSH自動(dòng)登陸的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

