Shell腳本應用(二)
- 條件測驗操作
- 使用if條件陳述句
- 使用if陳述句撰寫腳本
條件測驗操作
目的:shell 環境會根據執行命令回傳后狀態值($?)來判斷條件是否執行成功(回傳值為0 表示成功;回傳值為非0 值表示失敗或例外)
(一)、檔案測驗
| 選項 | 作用 |
|---|---|
| -d | 測驗是否為目錄(Directory) |
| -f | 測驗是否為檔案(File) |
| -e | 測驗目錄或檔案是否存在(Exist) |
| -r | 測驗當前用戶是否有權限讀取(Read) |
| -w | 測驗當前用戶是否有權限寫入(Write) |
| -x | 測驗當前用戶和是否有權限執行(Excute) |
通過條件測驗操作回傳的預定義變數"$?"的狀態值,從而判斷條件是否成立,
[root@localhost ~]# [ -d /media/cdrom ] 判斷/media/cdrom是否是一個目錄
[root@localhost ~]# echo $? 查看是否成立
0 回傳0表示條件成立
[root@localhost ~]# [ -f /media/cdrom ] 判斷/media/cdrom是否是一個檔案
[root@localhost ~]# echo $? 查看是否成立
1 回傳1表示條件不成立
(二)、邏輯測驗
作用:判斷兩個或多個條件的依賴關系
&&:邏輯與,且的意思;要求所有條件都得滿足
||:邏輯或得意思;多個條件只要滿足一個即可
! :邏輯否得意思;表示“不”;當指定條件不成立時,測驗命令回傳值為0
[root@localhost ~]# [ -e /mnt/ ] && echo "YES" 判斷/mnt/目錄是否存在,如果存在就輸出YES
YES
[root@localhost ~]# [ -f /mnt/ ] && echo "YES" || echo "NO" 判斷/mnt/是否為檔案,是就輸出YES,不是就輸出NO
NO
[root@localhost ~]# [ ! -d /mnt/ ] && echo "YES" || echo "NO" 判斷/mnt/不是目錄,是就輸出YES,不是就輸出NO
NO
(三)、整數值比較
| 選項 | 作用 |
|---|---|
| -eq | 第一個數等于第二個數(Equal) |
| -ne | 第一個數不等于第二個數(Not Equal) |
| -gt | 第一個數大于第二個數(Greater Than) |
| -ge | 第一個數大于或等于第二個數(Greater or Equal) |
| -lt | 第一個數小于第二個數(Lesser Than) |
| -le | 第一個數小于或等于第二個數(Lesser or Equal) |
[root@localhost ~]# aaa=`df | wc -l` 反撇號:提取命令執行后的輸出結果
[root@localhost ~]# echo $aaa
10
[root@localhost ~]# [ $aaa -gt 8 ] && echo "YES" || echo "NO" 判斷aaa變數是否大于8,成立輸出YES,不成立輸出NO
YES
[root@localhost ~]# [ $aaa -eq 8 ] && echo "YES" || echo "NO" 判斷aaa變數是否等于8,成立輸出YES,不成立輸出NO
NO
(四)、字串比較
作用:用來檢查用戶輸入、系統環境等是否滿足條件;來判斷用戶輸入的位置引數是否符合要求等
= : 第一個字串和第二個字串相同
!= : 第一個字串和第二個字串不相同 (! 就是取反)
-z: 用來檢查字串是否為空
[root@localhost ~]# [ $aaa = 10 ] && echo "YES" || echo "NO" 變數aaa等于10,則輸出YES;不等于則輸出NO
YES
[root@localhost ~]# [ $aaa != 10 ] && echo "YES" || echo "NO" 變數aaa不等于10,則輸出YES,等于則輸出NO
NO
撰寫一個簡單腳本
[root@localhost ~]# vim fugai.sh
#!/bin/bash
read -p "是否覆寫檔案:" AJBN 定義變數AJBN,并輸出提示資訊
[ $AJBN = yes | && echo "已覆寫" || echo "未覆寫"
##如果輸入的提示資訊是yes就輸出"已覆寫",否則輸出"未覆寫"
使用if條件陳述句
通過if 條件陳述句,實作流程控制方式;滿足某個條件時,回傳一個結果,否則去實作其他的結果
(一)、單分支if 陳述句
條件成立,會執行相應的代碼;否則不執行其他任何操作
if [ 條件運算式 ] (判斷,如果條件成立)
then
命令序列 (執行命令序列)
fi (結束判斷:條件不成立,不做任何操作)
單分支流程圖:

(二)、雙分支陳述句
滿足第一個條件做一個命令操作;除第一個條件以外的所有條件,都做第二個命令操作
if
[ 條件運算式 ]
then
命令序列1
else (除以上條件外的)
命令序列2
fi
雙分支流程圖:

(三)、多分支陳述句
根據測驗結果的成立或不成立進行多次判斷
if 條件測驗1
then
命令序列1
elif 條件測驗2
then
命令序列2
elif 條件測驗3
then
命令序列3
elif 條件測驗n
then
命令序列n
else
命令序列(n+1)
fi
多分支流程圖:

使用if陳述句撰寫腳本
(一)單分支if陳述句應用
[root@localhost ~]# vim 1.sh
#!/bin/bash
aaa=aaa.txt (定義一個變數)
if [ ! -e $aaa ] (判斷aaa.txt檔案不存在,判斷成功后)
then
touch $aaa (當判斷成功后,將該檔案創建出來)
fi (結束判斷:不做任何操作)

[root@localhost ~]# vim 2.sh
#!/bin/bash
read -p "輸入要洗掉檔案或目錄:" aaa
if [ -e $aaa ] 判斷變數aaa檔案或目錄是否存在,判斷成功后
then
rm -rf $aaa 當判斷成功后,洗掉變數aaa
fi 結束判斷;不做任何操作
(二)、雙分支if陳述句應用
#!/bin/bash
read -p "請輸入目標主機IP地址:" dizhi
ping -c 3 -i 0.2 -W 3 $dizhi &> /dev/null
##-c、-i、-W分別表示發送幾個測驗包、間隔幾秒、超時幾秒
if [ $? -eq 0 ]
then
echo "Host $dizhi is up"
else
echo "Host $dizhi is down"
fi

[root@localhost ~]# vim 4.sh
#!/bin/bash
systemctl status vsftpd &> /dev/null
if [ $? -eq 0 ]
then
echo "監聽地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
echo "行程PID號:$(pgrep -x vsftpd)"
else
echo "警告:vsftpd服務不可用"
fi
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# sh 4.sh
監聽地址::::21
行程PID號:58347
[root@localhost ~]# systemctl stop vsftpd
[root@localhost ~]# sh 4.sh
警告:vsftpd服務不可用

(三)、多分支if陳述句應用
#!/bin/bash
read -p "請輸入你的分數(0-100):" aaa 交換賦值
if [ $aaa -ge 85 ] && [ $aaa -le 100 ] 數值大于85或等于,小于100或等于
then
echo "$aaa 分,優秀!"
elif [ $aaa -ge 70 ] && [ $aaa -le 84 ] 數值大于70或等于,大于84或等于
then
echo "$aaa 分,良好"
elif [ $aaa -ge 60 ] && [ $aaa -le 69 ] 數值大于60或等于,小于69或等于
then
echo "$aaa 分,及格"
elif [ $aaa -le 59 ] 數值小于59或等于
then
echo "$aaa 分,不及格"
else
echo "請輸入0-100之間的分數" 當以上條件都不滿足時,輸出這個
fi

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/1339.html
標籤:其他
