shell編程之條件判斷與流程控制

            1. 按文件類型判斷
            測試選項(xiàng)                  作用
            -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 ]
               例:
               [ -e /root/install.log ] && echo yes || echo no

              2. 按文件權(quán)限進(jìn)行判斷
                測試選項(xiàng)                        作用
                    -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)行比較
                  測試選項(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è)判斷用于判斷硬鏈接是很好的方法
             
               4. 兩個(gè)整數(shù)之間比較
                    測試選項(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(小于等于為真)
  
               5. 字符串的判斷
                      測試選項(xiàng)                           作用
                        -z 字符串               判斷字符串是否為空(為空返回真)
                        -n 字符串               判斷字符串是否為非空(非空返回真) 
               字符串1 == 字符串2       判斷字符串1是否和字符串2相等(相等返回真)
           字符串1 !== 字符串2       判斷字符串1是否和字符串2不相等(不相等返回真)

                6. 多重條件判斷
                        測試選項(xiàng)                        作用
                    判斷1 -a 判斷2           邏輯與腐缤,判斷1和判斷2都成立捌归,最終的結(jié)果為真
                    判斷1 -o 判斷2           邏輯或,判斷1和判斷2有一個(gè)成立岭粤,最終的結(jié)果就為真
                    惜索!判斷                        邏輯非,是原始的判斷式取反

              單分支if條件語句
                    if [ 條件判斷式 ]绍在;then
                            程序
                    fi
                  或者
                    if [ 條件判斷式 ]
                          then
                            程序
                    fi

              單分支條件語句需要注意幾個(gè)點(diǎn)
                1. if語句使用fi結(jié)尾门扇,和一般語句使用大括號(hào)結(jié)尾不同
                2. [ 條件判斷式 ]  就是使用test命令判斷,所以中括號(hào)和條件判斷式之間必須有空格
                3. then后面跟符合條件之后執(zhí)行的程序偿渡,可以放在[]之后臼寄,用“;”分割吉拳,也可以換行寫入适揉,就不想要“嫉嘀;”了

             例1: 判斷登錄的用戶是否是root
                      #剪侮!/bin/bash
                      test = $( env | grep "USER" | cut -d "=" -f 2)
                      if [ "$test" == root ]
                        then
                          echo "current user is root"
                      fi
          
              例2: 判斷分區(qū)使用率
                     #杰标!/bin/bash
                       rate = $(df -h | grep "dev/sda1" | awk '{print $5}' | cut -d '%' -f 1)
                          if [ $rate -ge 80 ]
                              then
                                  echo "warning ! /dev/sda1 is full"
                          fi
  
              2. 雙分支if條件語句
                  if [ 條件判斷式 ]
                      then 
                            條件成立時(shí)腔剂,執(zhí)行的程序
                      else
                            條件不成立時(shí)掸犬,執(zhí)行另一個(gè)程序
                   fi
  
              例1 : 判斷輸入的是否是一個(gè)目錄
              #登渣!/bin/bash
                read -t 30 -p "please input a diretory " dir
                    if [ -d $dir ]
                        then
                            echo "yes"
                       else
                            echo "no"
                     fi

              例2: 判斷apache 是否啟動(dòng)
                  #胜茧!/bin/bash
                    test = $(ps aux | grep httpd } grep -v grep)
                      if [ -n "$test" ]
                            then
                                echo "$(date) httpd is ok !">>/tmp/acc.log
                            else                     
                                 /etc/rc,d/init.d/httpd start &> /dev/null
                                 echo "$(date) restart httpd! " >> err.log
                      fi

              3. 多分支if條件語句
                  if [ 條件判斷式1 ]
                        then
                              當(dāng)條件判斷式1成立時(shí)仇味,執(zhí)行程序1
                  elif  [ 條件判斷式2 ]
                         then
                               當(dāng)條件判斷式2成立時(shí)丹墨,執(zhí)行程序2
                   else
                                當(dāng)所有條件都不成立時(shí),最后執(zhí)行此程序
                    fi

                例: 計(jì)算器
                  #喉前!/bin/bash
                  read -t 30 -p "please input first num : " firstnum
                  read -t 30 -p "please input last num : " lastnum
                  read -t 30 -p "please input your operation : " operation
  
                  if [ -n "$firstnum" -a -n "$lastnum" -a -n "$operation" ]
                            then
                            judgefirstnum =  $( echo $firstnum | sed 's/[0-9]//g')
                            judgelastnum =  $( echo $lastnum | sed 's/[0-9]//g')
                            
                            if [ -z "$jugefirstnum" -a -z "$judgelastnum " ]
                                    then
                                      if [ "$operation" == "+" ]
                                            then
                                                  sum = $(( $firstnum+$lastnum ))
                                      elif [ "$operation" == "-" ]
                                            then
                                                  sum = $(( $firstnum-$lastnum ))
                                      elif [ "$operation" == "*" ]
                                            then
                                                  sum = $(( $firstnum*$lastnum ))
                                       elif [ "$operation" == "/" ]
                                            then
                                                  sum = $(( $firstnum/$lastnum ))
                                       else
                                              echo "please enter a valid value"
                                              exit
                                        fi
                                      echo $firstnum $operation $lastnum "=" $sum
                      else
                            echo "please enter valid value 2"
                            exit
                      if
            else
                 echo "please enter valid value 3"
            fi

        例: 判斷用戶輸入的是什么文件
                 #裕便!/bin/bash
                   read -t 30 -p "please input a file name " file
                        if [ -z "$file" ]
                              then
                                  echo "error please input a filename"
                                  exit 11
                        elif [ -e "$file" ]
                              then
                                  echo "your input is not a file"
                                  exit 12
                         elif [ -f "$file" ]
                              then
                                  echo "$file is a regulare file"
                          elif [ -d "$file" ]
                              then
                                  echo "$file is a disectory"
                          else
                                 echo "$file is an other file"
                          fi

             多分支case條件語句
                case語句和if...elif...else語句一樣都是多分支條件語句改览,不過和if多分支條件語句不同的事宝当,case語句只能判斷一種條件關(guān)系庆揩,而if語句可以判斷多種條件關(guān)系

                 case  $變量名  in
                      "值1")
                          如果變量值等于1盾鳞,則執(zhí)行程序1
                          ;;
                      "值2")
                          如果變量值等于2,則執(zhí)行程序2
                          ;;
                      *)
                          如果變量值都不是以上的值,則執(zhí)行此程序
                          ;;
                  esac

        例:
                #推励!/bin/bash
                  read -t 30 -p "please choose yes/no" cho
                    
                    case $cho in 
                          "yes")
                                echo "your choose is yes"
                                ;;
                          "no")
                                echo "your choose is no"
                                ;;
                          *)
                                echo "your choose is yes"
                                ;;                                          
              esac

              for 循環(huán)
                  語法1
                    for  變量  in   值1 值2 值3
                          do
                                  程序
                          done

              例:
                     #!/bin/bash
                            for i in 1 2 3 4 5
                                    do
                                        echo $i
                                    done
                
                       #!/bin/bash
                            cd /root/test
                            ls *.tar.gz >ls.log
                             for i in $(cat ls.log)
                              do
                                   tar -zxvf $i &> /dev/null
                             done
                         rm -rf ls.log
    
            語法2 
                for (( 初始值验辞;循環(huán)控制條件;變量變化 ))
                          do  
                              程序
                          done
                 
              例:
                #跌造!/bin/bash
                    s=0
                     for (( i=1; i<100; i=i+1 ))
                          do
                              s=$(( $s+$i ))
                          done

             例:批量添加數(shù)量的用戶
            #!/bin/bash
            read -t 30 -p "please input user name " name
            read -t 30 -p "please input the number of users " num
            read -t 30 -p "please input the password of users " pass

            if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
              then
                y=$(echo $num | sed 's/[0-9]//g')
                if [ -z "$y" ]
                        then
                            for (( i=1; i<=$num ; i=i+1 ))
                                do
                                    /usr/sbin/useradd $name$i &> /dev/null
                                    echo $pass | /usr/bin/paswd --stdin $name$i &>/dev/null
                                done
                  fi
          fi

           例: 刪除所有用戶
               #!/bin/bash

                  for i in $(cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1 )
                          do
                                userdel -r $i
                          done
             
            while循環(huán)
              while循環(huán)是不定循環(huán)壳贪,也稱作條件循環(huán)陵珍。只要條件判斷式成立,循環(huán)就會(huì)一直繼續(xù)违施,知道條件判斷式不成立,循環(huán)才會(huì)停止磕蒲。這就和for的固定循環(huán)不太一樣了。

            while  [ 條件判斷式 ]
                  do
                        程序
                  done

              例:
                  #!/bin/bash
                      i=1
                      s=0
                      while [ $i -le 100 ]
                        do 
                            s=$(( $s+$i ))
                            i=$(( $i+1 ))
                        done
                      echo "the num is $s" 

                  until循環(huán)
                    untile循環(huán)钻哩,和while循環(huán)相反屹堰,until循環(huán)時(shí)只要條件判斷式不成立則進(jìn)行循環(huán),并執(zhí)行循環(huán)程序珊肃,一旦循環(huán)條件成立荣刑,則終止循環(huán)
      
                  until [ 條件判斷式 ]
                        do  
                            程序
                        done
              
                例:
                
                   #!/bin/bash
                    i=1
                    s=0
                      until [ $i -gt 100 ]
                            do  
                                s=$(( $s+$i )) 
                                i = $(( $i +1 ))
                             done
                      echo "the sum is : $s"              

      














最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伦乔,一起剝皮案震驚了整個(gè)濱河市厉亏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烈和,老刑警劉巖爱只,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異招刹,居然都是意外死亡恬试,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門疯暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來训柴,“玉大人,你說我怎么就攤上這事妇拯』媚伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵越锈,是天一觀的道長宣赔。 經(jīng)常有香客問我,道長瞪浸,這世上最難降的妖魔是什么儒将? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮对蒲,結(jié)果婚禮上钩蚊,老公的妹妹穿的比我還像新娘贡翘。我一直安慰自己,他們只是感情好砰逻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布鸣驱。 她就那樣靜靜地躺著,像睡著了一般蝠咆。 火紅的嫁衣襯著肌膚如雪踊东。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天刚操,我揣著相機(jī)與錄音闸翅,去河邊找鬼。 笑死菊霜,一個(gè)胖子當(dāng)著我的面吹牛坚冀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鉴逞,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼记某,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了构捡?” 一聲冷哼從身側(cè)響起液南,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勾徽,沒想到半個(gè)月后贺拣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捂蕴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年譬涡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥辨。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涡匀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉知,到底是詐尸還是另有隱情陨瘩,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布级乍,位于F島的核電站舌劳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玫荣。R本人自食惡果不足惜甚淡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捅厂。 院中可真熱鬧贯卦,春花似錦资柔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啡彬,卻和暖如春羹与,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庶灿。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工纵搁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跳仿。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓诡渴,卻偏偏與公主長得像捐晶,于是被迫代替她去往敵國和親菲语。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. 條件判斷式語句 -d -d -f 為常用 推薦使用[-e /root/install.log] 邏輯與"&&...
    單純的土豆閱讀 366評(píng)論 0 0
  • 條件判斷與流程控制 條件判斷式 按照文件類型進(jìn)行判斷 按照文件權(quán)限進(jìn)行判斷 兩個(gè)文件之間進(jìn)行比較 兩個(gè)整數(shù)之間比較...
    靜候那一米陽光閱讀 311評(píng)論 0 0
  • 今天拿起放了有一段時(shí)間的(刻意練習(xí))惑灵,心底一直在有一個(gè)聲音提醒自己山上,在自控力的讀寫訓(xùn)練中,其實(shí)最大的部分應(yīng)該是看書...
    幽蘭依依閱讀 99評(píng)論 0 1
  • 《此生未完成》是我剛剛看完的一本書英支,作者是復(fù)旦大學(xué)青年教師乳腺癌晚期骨轉(zhuǎn)移患者于娟佩憾,留下一本病中日記,牽動(dòng)無數(shù)網(wǎng)友...
    天真小魔王閱讀 1,123評(píng)論 4 3
  • 聽李晶老師班主任工作感悟 2017年7月19日...
    Candy520閱讀 967評(píng)論 0 0