[Shell]条件判断与流程控制:if, case, for, while, until
【條件判斷】
1. 按文件類型進(jìn)行判斷
-b 文件? ? 判斷該文件是否存在,并且為塊設(shè)備文件(是塊設(shè)備文件為真)
-c 文件????判斷該文件是否存在,并且為字符設(shè)備文件(是字符設(shè)備文件為真)
-d 文件? ? 判斷該文件是否存在,并且為目錄文件(是目錄為真)
-e 文件? ? 判斷該文件是否存在(存在為真)
-f 文件? ? 判斷該文件是否存在,并且為普通文件(是普通文件為真)
-L 文件? ? 判斷該文件是否存在,并且為符號(hào)鏈接文件(是符號(hào)鏈接文件為真)
-p 文件? ? 判斷該文件是否存在,并且為管道文件(是管道文件為真)
-s 文件? ? 判斷該文件是否存在,并且為非空(非空為真)
-S 文件? ? 判斷該文件是否存在,并且為套接字文件(是套接字文件為真)
?
兩種判斷格式:
? ? ① test -e /root/install.log
? ? ② [ -e /root/install.log ]
?
????[ -f /root/install.log?] && echo 'yes' || echo 'no'
?
2. 按照文件權(quán)限進(jìn)行判斷(不區(qū)分所有者, 所屬組)
-r 文件? ? 判斷該文件是否存在,并且擁有讀權(quán)限(有讀權(quán)限為真)
-w 文件? ? 判斷該文件是否存在,并且擁有寫權(quán)限(有寫權(quán)限為真)
-x 文件? ? 判斷該文件是否存在,并且擁有執(zhí)行權(quán)限(有執(zhí)行權(quán)限為真)
-u 文件? ? 判斷該文件是否存在,并且擁有SUID權(quán)限(有SUID權(quán)限為真)
-g 文件? ? 判斷該文件是否存在,并且擁有SGID權(quán)限(有SGID權(quán)限為真)
-k 文件? ? 判斷該文件是否存在,并且擁有SBit權(quán)限(有SBit權(quán)限為真)
?
3. 兩個(gè)文件之間進(jìn)行比較
文件1 -nt 文件2? ? 判斷文件1的修改時(shí)間是否比文件2的新(如果新則為真)
文件1 -ot 文件2? ? 判斷文件1的修改 時(shí)間是否比文件2的舊
文件1 -ef 文件2? ? 判斷文件1是否和文件2的Inode號(hào)一致,可以理解為兩個(gè)文件是否為同一個(gè)文件。這個(gè)判斷用于判斷硬鏈接是很好的方法。
?
4. 兩個(gè)整數(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(小于等于為真)
?
[ 1 eq 2 ] && echo 'yes' || echo 'no'
?
5. 字符串的判斷
-z 字符串? ? 判斷字符串是否為空(為空返回真)
-n 字符串? ? 判斷字符串是否為非空(非空返回真)
字符串1 == 字符串2? ? 判斷字符串1和字符串2是否相等(相等返回真)
字符串1 != 字符串2? ? 判斷字符串1是否和字符串2不相等(不相等返回真)
name=chen
[?-z "$name" ] && echo 'yes' || echo 'no'
?
6. 多重條件判斷
判斷1 -a 判斷2? ? 邏輯與,判斷1和判斷2都成立,最終的結(jié)果才為真
判斷1 -o 判斷2? ? 邏輯或,判斷1和判斷2有一個(gè)成立,最終的結(jié)果就為真
! 判斷? ? 邏輯非,使原始的判斷式取反
a=24
[ -n "$a" -a "$a" -gt 23 ] && echo 'yes' || echo 'no'
?
【流程控制 - if 語句】
1. 單分支if條件語句
if [ 條件判斷式 ]; then程序 fi if test -z "$ac_version"; then?程序 fi或者
if [ 條件判斷式 ]then程序 fi?
注意:
? ? ① if開頭,fi結(jié)尾
? ? ② [ 條件判斷式 ]就是使用test命令判斷,所以中括號(hào)和條件判斷式之間必須有空格
? ? ③ then后面跟符合條件之后執(zhí)行的程序,可以放在[]之后,用" ; "分割,也可以換行寫入,就不需要" ; "了。
?
#!/bin/bash # 統(tǒng)計(jì)根分區(qū)使用率rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1) # 把根分區(qū)使用率作為變量值賦予變量rateif [ $rate -ge 80 ]; thenecho "Warning! /dev/sda3 is full !" fi?
2. 雙分支if條件語句
if [ 條件判斷式 ]then條件成立時(shí),執(zhí)行的程序else條件不成立時(shí),執(zhí)行的另一個(gè)程序 fi?
#!/bin/bash # 備份mysql數(shù)據(jù)庫ntpdate asia.pool.ntp.org &> /dev/null # 同步系統(tǒng)時(shí)間(需聯(lián)網(wǎng))date=$(date +%y%m%d) # 把當(dāng)前系統(tǒng)時(shí)間按照"年月日"格式賦予變量datesize=$(du -sh /var/lib/mysql) # 統(tǒng)計(jì)mysql數(shù)據(jù)庫的大小,并把大小賦予size變量if [ -d /tmp/dbbak ]thenecho "Date: $date!" > /tmp/dbbak/dbinfo.txtecho "Data size: $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
&> /dev/null # 把所有輸出丟棄
rm -rf /tmp/dbbak/dbinfo.txt # 卸磨殺驢elsemkdir /tmp/dbbak... fi
?
#!/bin/bash # 判斷Apache是否啟動(dòng) ( 先安裝nmap:rpm -ivh http://nmap.org/dist/nmap-4.68-1.i386.rpm )port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}') # 使用nmap命令掃描服務(wù)器,并截取apache服務(wù)的狀態(tài),賦予變量portif [ "$port" == "open" ]thenecho "$(date) httpd is ok!" >> /tmp/httpd-acc.log # 如果狀態(tài)正常,追加到日志中else/etc/rc.d/init.d/httpd start &> /dev/null # 把所有輸出丟棄echo "$(date) httpd reboot!" >> /tmp/httpd-err.log # 重啟記錄追加到錯(cuò)誤日志 fi
?
3. 多分支if條件語句
if [ 條件判斷式1 ]then當(dāng)條件判斷式1成立時(shí),執(zhí)行程序1elif [ 條件判斷式2 ]then當(dāng)條件判斷式2成立時(shí),執(zhí)行程序2...更多判斷...else當(dāng)所有條件都不成立時(shí),最后執(zhí)行此程序 fi?
#!/bin/bash # 判斷用戶輸入的是什么文件read -p "Please input a filename:" file # 接收鍵盤的輸入,并賦予變量fileif [ -z "$file" ]thenecho "Error, please input a filename"exit 1elif [ ! -e "$file" ] # 判斷file的值是否存在thenecho "Your input is not a file!"exit 2elif [ -f "$file" ] # 判斷file的值是否為普通文件thenecho "$file is a regular fie!"elif [ -d "$file" ]thenecho "$file is a directory!"elseecho "$file is an other file!" fi?
【流程控制 - case 語句】
多分支case條件語句:case語句只能判斷一種條件關(guān)系,而if語句可以判斷多種條件關(guān)系。
case $變量名 in"值1")如果變量的值等于值1,則執(zhí)行程序1;;"值2")如果變量的值等于值2,則執(zhí)行程序2;;*)如果變量的值都不是以上的值,則執(zhí)行此程序;; esac
?
#!/bin/bash # 判斷用戶輸入read -p "Please choose yes/no" -t 30 chocase $cho in"yes")echo "You choose yes";;"no")echo "You choose no";;*)echo "You choose none";; esac
?
【流程控制 - for 循環(huán)】
語法1:
for 變量 in 值1 值2 值3... ; do程序 done語法2:
for (( 初始值; 循環(huán)控制條件; 變量變化 ))do程序done?
#!/bin/bash # 打印時(shí)間for time in morning noon afternoon evening ; doecho "This time is $time" donefor i in 1 2 3 4 ; doecho $i done
?
#!/bin/bash # 批量解壓縮腳本cd /lnmp ls *.tar.gz > ls.logfor i in $(cat ls.log) ; dotar -zxf $i &> /dev/null done rm -rf /lnmp/ls.log?
#!/bin/bash # 求和s=0 for (( i=1; i<=100; i++ )) ; dos=$(( $s + $i )) doneecho "The sum of 1+2+3+...+100 is : $s"
?
#!/bin/bash # 批量添加指定數(shù)量的用戶read -p "Please input user name:" -t 30 name read -p "Please input the number of users:" -t 30 num read -p "Please input the password of users:" -t 30 pass# -a用于連續(xù)多個(gè)條件判斷 if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]theny=$(echo $num | sed 's/^[0-9]*$//g') # 任意數(shù)字替換為空if [ -z "$y" ] # 如果y的值是空,則num是數(shù)字thenfor (( i=0; i<=$num; i++ ))do/usr/sbin/useradd $name$i &> /dev/nullecho $pass | /usr/bin/passwd --stdin "$name$i" &> /dev/nulldonefi fi?
【流程控制 - while 和 until 循環(huán)】
while循環(huán)是條件循環(huán),只要條件判斷式成立,循環(huán)就會(huì)一直繼續(xù),直到條件判斷式不成立,循環(huán)才會(huì)停止。
while [ 條件判斷式 ]do程序done?
#!/bin/bash # 示例用法while [ $# -gt 0 ]; docase "$#" in3)echo "第一個(gè)參數(shù)是$1, 參數(shù)個(gè)數(shù)是$#";;4)echo "第一個(gè)參數(shù)是$1, 參數(shù)個(gè)數(shù)是$#";;*)echo 'What happened';;esac # 與case對(duì)應(yīng)構(gòu)成case語句,形如if和ficase "$#" inabc)... ;;esacshift # 用shift命令把位置參數(shù)左移 done運(yùn)行如:./example.sh 3 4 5
?
until循環(huán):和while循環(huán)相反,until循環(huán)時(shí)只要條件判斷式不成立則進(jìn)行循環(huán),并執(zhí)行循環(huán)程序。一旦循環(huán)條件成立,則終止循環(huán)。
#!/bin/bashi=1 s=0 until [ "$i" -gt 100 ] # 循環(huán)直到變量i的值大于100就停止循環(huán)dos=$(( $i + $s))i=$(( $i + 1 ))doneecho "The sum is : $i"
?
【總結(jié)】
Shell適用:幫助管理員減少重復(fù)操作或進(jìn)行運(yùn)維操作,不適合進(jìn)行復(fù)雜的運(yùn)算的場(chǎng)合。
如何建立編程思想:學(xué)習(xí),練習(xí),知道讓程序幫你干什么。
轉(zhuǎn)載于:https://www.cnblogs.com/wanglijun/p/8707621.html
總結(jié)
以上是生活随笔為你收集整理的[Shell]条件判断与流程控制:if, case, for, while, until的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IIS应用池保持激活工具开发
- 下一篇: 解决IE8IE9 jquery ajax
