Shell腳本中if條件判斷的寫法實例
前言
if…else… 可以說是我們在編程中最常見的條件判斷語句了,那么在 Shell 中如何使用呢?如何判斷兩個數(shù)值相等?如何判斷一個文件是否存在?跟隨這篇文章,一起來學習吧!
條件判斷格式
在 Shell 中有兩種判斷格式,分別如下:
# 1. 第一種 test ?條件判斷式 # 2. 第二種,注意括號兩端必須有空格 [ ?條件判斷式 ] ? ?
第二種方式相當于第一種的簡化。那么我們如何知道一個條件判斷語句是否為真呢?其實在 Bash中的變量類型,還有這兩種! 的預定義變量部分 ,我們學習過如何判斷一個命令是否執(zhí)行成功,即 $? 是否等于 0,0表示執(zhí)行成功,否則表示上個命令失敗,條件判斷也是使用這種方式。
# 查看文件列表 [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 # 換個姿勢,再來測試一遍 [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 語句
- if 開頭,fi 結尾
- [ 條件判斷 ] 就是使用 test 命令判斷,兩端必須有空格
- if 如果 和 then 在一行,需要加 ;
單分支
if [ 條件判斷式 ];then
命令
fi或者
if [ 條件判斷式 ]
then
命令
fi
雙分支
if [ 條件判斷式 ]
then
命令
else
命令
fi
多分支
if [ 條件判斷式1 ]
then
命令
elif [ 條件判斷式2 ]
then
命令
...else
命令
fi
條件判斷類型
按照文件類型進行判斷
測試選項 | 作用 |
---|---|
-b 文件 | 判斷該文件是否存在,并且是否為塊設備文件 |
-c 文件 | 判斷該文件是否存在,并且是否為字符設備文件 |
-d 文件 | 判斷該文件是否存在,并且是否為目錄文件 |
-e 文件 | 判斷該文件是否存在 |
-f 文件 | 判斷該文件是否存在,并且是否為普通文件 |
-L 文件 | 判斷該文件是否存在,并且是否為符號鏈接文件 |
-p 文件 | 判斷該文件是否存在,并且是否為管道文件 |
-s 文件 | 判斷該文件是否存在,并且是否為空 |
-S 文件 | 判斷該文件是否存在,并且是否為套接字文件 |
# 1. 新建一個腳本文件 [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í)行權限 [root@VM-0-5-centos ~]# chmod 755 file_test.sh # 3. 測試執(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
為了測試各種判斷類型方便,我們可以直接使用如下方式測試,避免每次寫腳本了。
# 一個命令正確執(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
按照文件權限進行判斷
測試選項 | 作用 |
---|---|
-r 文件 | 判斷該文件是否存在,并且是否擁有讀權限 |
-w 文件 | 判斷該文件是否存在,并且是否擁有寫權限 |
-x 文件 | 判斷該文件是否存在,并且是否擁有執(zhí)行權限 |
[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
文件之間比較
測試選項 | 作用 |
---|---|
文件1 -nt 文件2 | 判斷文件1的修改時間是否比文件2的新 |
文件1 -ot 文件2 | 判斷文件1的修改時間是否比文件2的舊 |
文件1 -ef 文件2 | 判斷文件1是否和文件2的Inode號一致,可以理解兩個文件是否為同一個文件。這個判斷用于判斷硬鏈接是個很好的方法。 |
# 創(chuàng)建硬鏈接后測試 [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ù)之間比較
測試選項 | 作用 |
---|---|
整數(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
字符串的判斷
測試選項 | 作用 |
---|---|
-z 字符串 | 字符串是否為空 |
-n 字符串 | 字符串是否非空 |
字符串1 == 字符串2 | 字符串是否相等 |
字符串1 != 字符串2 | 字符串是否不等 |
if 判斷中對于變量的處理,需要加引號,如果沒有加雙引號,可能會在判斷含空格的字符串變量的時候產生錯誤。
[root@VM-0-5-centos ~]# name="" # 不見引號,判斷出的 name 是非空,其實是空 [root@VM-0-5-centos ~]# ?[ -n $name ] && echo 'yes' || echo 'no' yes # 加上引號就對了 [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
多重條件判斷
測試選項 | 作用 |
---|---|
判斷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 判斷語句參數(shù)
[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個塊特殊文件則為真。
[ -c FILE ] 如果 FILE 存在且是一個字特殊文件則為真。
[ -d FILE ] 如果 FILE 存在且是一個目錄則為真。
[ -e FILE ] 如果 FILE 存在則為真。
[ -f FILE ] 如果 FILE 存在且是一個普通文件則為真。
[ -g FILE ] 如果 FILE 存在且已經設置了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個符號連接則為真。
[ -k FILE ] 如果 FILE 存在且已經設置了粘制位則為真。
[ -p FILE ] 如果 FILE 存在且是一個名字管道(F如果O)則為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則為真。
[ -s FILE ] 如果 FILE 存在且大小不為0則為真。
[ -t FD ] 如果文件描述符 FD 打開且指向一個終端則為真。
[ -u FILE ] 如果 FILE 存在且設置了SUID (set user ID)則為真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫的則為真。
[ -x FILE ] 如果 FILE 存在且是可執(zhí)行的則為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。
[ -L FILE ] 如果 FILE 存在且是一個符號連接則為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。
[ -S FILE ] 如果 FILE 存在且是一個套接字則為真。
[ 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 指向相同的設備和節(jié)點號則為真。
[ -o OPTIONNAME ] 如果 shell選項 “OPTIONNAME” 開啟則為真。
[ -z STRING ] “STRING” 的長度為零則為真。
[ -n STRING ] or [ STRING ] “STRING” 的長度為非零 non-zero則為真。
[ STRING1 == STRING2 ] 如果2個字符串相同。 “=” 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.
總結
本篇文章首先介紹了條件判斷的格式以及原理,然后介紹了 if 語句的格式,最后介紹了多個條件判斷類型。內容比較多,熟能生巧,快操練起來吧!
到此這篇關于Shell腳本中if條件判斷寫法的文章就介紹到這了,更多相關Shell腳本if條件判斷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Shell監(jiān)控iptables運行狀態(tài)
這篇文章主要介紹了Shell監(jiān)控iptables運行狀態(tài),本文腳本會判斷iptables的狀態(tài)并選擇啟動或者重啟動,需要的朋友可以參考下2014-12-12