电竞比分网-中国电竞赛事及体育赛事平台

分享

shell程序編寫(xiě)從入門(mén)到精通(下)

 todaytomo 2006-12-28
Until語(yǔ)句
  While語(yǔ)句中,只要某條件為真,則重復(fù)執(zhí)行循環(huán)代碼,until語(yǔ)句正好同while相反,該語(yǔ)句使循環(huán)代碼重復(fù)執(zhí)行,直到遇到某一條件為真才停止。
  
  Until語(yǔ)句的結(jié)構(gòu)如下:
  until command
    do
      command
      command
      … …
    done
  
  可以用until語(yǔ)句替換上面?zhèn)浞莩绦虻膚hile語(yǔ)句,完成同樣的功能:
  
  until [ $ANS != Y -a $ANS != y ]
  
  for 循環(huán)
  在介紹for循環(huán)之前,我們要學(xué)個(gè)非常有用的unix命令:shift。我們知道,對(duì)于位置變量或命令行參數(shù),其個(gè)數(shù)必須是確定的,或者當(dāng)Shell程序不知道其個(gè)數(shù)時(shí),可以把所有參數(shù)一起賦值給變量$*。若用戶(hù)要求Shell在不知道位置變量個(gè)數(shù)的情況下,還能逐個(gè)的把參數(shù)一一處理,也就是在$1后為$2,在$2后面為$3等。在 shift命令執(zhí)行前變量$1的值在shift命令執(zhí)行后就不可用了。
  
  示例如下:
  
  #測(cè)試shift命令(x_shift.sh)
    until [ $# -eq 0 ]
    do
       echo "第一個(gè)參數(shù)為: $1 參數(shù)個(gè)數(shù)為: $#"
       shift
    done
  執(zhí)行以上程序x_shift.sh:
    $./x_shift.sh 1 2 3 4
  
  結(jié)果顯示如下:
  
  第一個(gè)參數(shù)為: 1 參數(shù)個(gè)數(shù)為: 3
  第一個(gè)參數(shù)為: 2 參數(shù)個(gè)數(shù)為: 2
  第一個(gè)參數(shù)為: 3 參數(shù)個(gè)數(shù)為: 1
  第一個(gè)參數(shù)為: 4 參數(shù)個(gè)數(shù)為: 0
  
  從上可知shift命令每執(zhí)行一次,變量的個(gè)數(shù)($#)減一,而變量值提前一位,下面代碼用until和shift命令計(jì)算所有命令行參數(shù)的和。
  
  #shift上檔命令的應(yīng)用(x_shift2.sh)
    if [ $# -eq 0 ]
    then
      echo "Usage:x_shift2.sh 參數(shù)"
      exit 1
    fi
    sum=0
    until [ $# -eq 0 ]
    do
      sum=`expr $sum + $1`
      shift
    done
    echo "sum is: $sum"
  
  執(zhí)行上述程序:
  
    $x_shift2.sh 10 20 15
  
  其顯示結(jié)果為:
  
    45
  
  shift命令還有另外一個(gè)重要用途,Bsh定義了9個(gè)位置變量,從$1到$9,這并不意味著用戶(hù)在命令行只能使用9個(gè)參數(shù),借助shift命令可以訪(fǎng)問(wèn)多于9個(gè)的參數(shù)。
  
  Shift命令一次移動(dòng)參數(shù)的個(gè)數(shù)由其所帶的參數(shù)指定。例如當(dāng)shell程序處理完前九個(gè)命令行參數(shù)后,可以使用shift 9命令把$10移到$1。
  
  在熟悉了shift命令后,我們一起看看,Bsh程序中非常有用的for循環(huán)語(yǔ)句,這種循環(huán)同上面說(shuō)的while和until循環(huán)不同,for語(yǔ)句中的循環(huán)是否執(zhí)行并不由某個(gè)條件的真和假來(lái)決定,決定for循環(huán)是否繼續(xù)的條件是參數(shù)表中是否還有未處理的參數(shù)。
  
  For語(yǔ)句的結(jié)構(gòu)如下:
  
  for variable in arg1 arg2 … argn
  do
    command
    command
    … …
  done
  
  下面是for循環(huán)的簡(jiǎn)單例子:
  
  for LETTER in a b c d
  do
     echo $LETTER
  done
  
  程序執(zhí)行結(jié)果如下:
  
  a
  b
  c
  d
  
  在上面計(jì)算參數(shù)和的例子中,我們可以用for循環(huán),實(shí)現(xiàn)如下:
  
  #測(cè)試 for 程序(x_for.sh)
  
  if [ $# -eq 0 ]
  then
     echo "Usage:x_for.sh 參數(shù)… …"
     exit 1
  fi
  sum=0
  for I in $*
  do
     sum=`expr $sum + $I`
  done
  echo "sum is: $sum"
  
  中斷循環(huán)指令
  在程序循環(huán)語(yǔ)句中,我們有時(shí)候希望遇到某中情況時(shí)候結(jié)束本次循環(huán)執(zhí)行下次循環(huán)或結(jié)束這個(gè)循環(huán),這就涉及到兩條語(yǔ)句:continue和break。continue命令可使程序忽略其后循環(huán)體中的其他指令,直接進(jìn)行下次循環(huán),而break命令則立刻結(jié)束循環(huán),執(zhí)行循環(huán)體后面的的語(yǔ)句。
  
  #測(cè)試continue
  I=1
  while [ $I -lt 10 ]
  do
    if [ $I -eq 3 ]
    then
      continue
    fi
    if [ $I -eq 7 ]
    then
      break
    fi
    echo "$I\c"
  done
  
  執(zhí)行上面程序,結(jié)果如下:
  
  12456789
  
  與或結(jié)構(gòu)
  
  使用與/或結(jié)構(gòu)有條件的執(zhí)行命令
  
  Shell程序中可以使用多種不同的方法完成相同的功能,例如until和while語(yǔ)句就可以完成相同的功能,同樣,除了if-then-else結(jié)構(gòu)可以使命令有條件的執(zhí)行外,$$和||操作符也能完成上述功能。在C語(yǔ)言中這兩個(gè)操作符分別表示邏輯與和邏輯或操作。在Bourne Shell中,用&&連接兩條命令的含義只有前面一條命令成功執(zhí)行了,后面的命令才會(huì)執(zhí)行。
  
    &&操作的形式為:
  
      command && command
  
    例如語(yǔ)句:
  
      rm $TEMPDIR/* && echo "Files successfully removed"
  
    只有rm命令成功執(zhí)行以后,才會(huì)執(zhí)行echo命令。若用if-then語(yǔ)句實(shí)現(xiàn)上述功能,形式為:
  
      if rm $TEMPDIR/*
      then
        echo "Files successfully removed"
      fi
    相反,用||連接兩條命令的含義為只有第一條命令執(zhí)行失敗才執(zhí)行第二條命令,例如:
  
      rm $TEMPDIR/* || echo "File were not removed"
  
    上面語(yǔ)句的等價(jià)形式為:
  
      if rm $TEMPDIR/*
      then
        :
      else
        echo "Files were not removed"
      fi
  這兩種操作符可以聯(lián)合使用,如在下面的命令行中,只有command1和command2執(zhí)行成功后,command3才會(huì)執(zhí)行:
  
      command1 && command2 && command3
  
  下面的命令行表示只有command1成功執(zhí)行,command2不成功執(zhí)行時(shí),才會(huì)執(zhí)行command3。
  
  &&和||操作符可以簡(jiǎn)化命令條件執(zhí)行的格式,但一般只用于一條命令的條件執(zhí)行。如果許多命令都使用這兩個(gè)操作符,那么整個(gè)程序的可讀性將變的很差,所以在多條命令的條件執(zhí)行時(shí),最好采用可讀性好的if語(yǔ)句。
  
  函數(shù)
  現(xiàn)在我們介紹Shell程序中的函數(shù)部分,基本上任何高級(jí)語(yǔ)言都支持函數(shù)這個(gè)東西,能讓我們勝好多事情的東西,至少省的頻繁的敲擊相同的東西,好了come onShell程序中的函數(shù)
  
  函數(shù)又叫做子程序,可以在程序中的任何地方被調(diào)用,其格式如下:
  
    函數(shù)名字()
    {
      command
      ... ...
      command;
    }
  
  Shell程序的任何地方都可以用命令 "函數(shù)名字" 調(diào)用,使用函數(shù)的好處有兩點(diǎn),一點(diǎn)是使用函數(shù)可以把一個(gè)復(fù)雜的程序化為多個(gè)模塊,易于管理,符合結(jié)構(gòu)化程序的設(shè)計(jì)思想,另一個(gè)好處是代碼的重用。
  
  Shell函數(shù)和Shel程序比較相似,它們的區(qū)別在于Shell程序在子Shell中運(yùn)行,而Shell函數(shù)在當(dāng)前Shell中運(yùn)行。因此,在當(dāng)前Shell中可以看到Shell函數(shù)對(duì)變量的修改。在任何Shell中都可以定義函數(shù),包括交互式Shell。
  
  例如:
  
      $dir() {ls -l;}
  
  結(jié)果是我們?cè)?后面打dir,其顯示結(jié)果同ls -l的作用是相同的。該dir函數(shù)將一直保留到用戶(hù)從系統(tǒng)退出,或執(zhí)行了如下所示的unset命令:
      $unset dir
  下面的例子說(shuō)明了函數(shù)還可以接受位置參數(shù):
  
      $dir(){_
      >echo "permission    ln owner   group    file sz last access
      >ls -l $*;
      >}
  
  運(yùn)行 dir a* 看產(chǎn)生什么結(jié)果
  
  參數(shù)a*傳遞到dir函數(shù)中并且代替了$*
  
  通常Shell程序?qū)⒃谧覵hell中執(zhí)行,該程序?qū)ψ兞康母淖冎辉谧覵hell中有效而在當(dāng)前Shell中無(wú)效。"."命令可以使Shell程序在當(dāng)前Shell中執(zhí)行。用戶(hù)可以在當(dāng)前Shell中定義函數(shù)和對(duì)變量賦值。通常用下面命令來(lái)重新初使化.profile對(duì)Shell環(huán)境的設(shè)置。
      $ . .profile
  由于看到這部分相對(duì)簡(jiǎn)單,我們還是順便說(shuō)說(shuō)trap好了
  
  使用trap命令進(jìn)行例外處理
  用戶(hù)編寫(xiě)程序在程序運(yùn)行時(shí)可能會(huì)發(fā)生一些例外情況,比如執(zhí)行該程序的用戶(hù)按中斷鍵或使用kill命令,或者控制終端突然與系統(tǒng)斷開(kāi)等。unix系統(tǒng)中的上述情況會(huì)使系統(tǒng)向進(jìn)程發(fā)一個(gè)信號(hào),通常情況下該信號(hào)使進(jìn)程終止運(yùn)行。有時(shí)侯用戶(hù)希望進(jìn)程在接到終止信號(hào)時(shí)進(jìn)行一些特殊的操作。若進(jìn)程在運(yùn)行時(shí)產(chǎn)生一些臨時(shí)文件,又因接受到的信號(hào)而終止。那么該進(jìn)程產(chǎn)生的臨時(shí)文件將保留下來(lái)。在bsh中,用戶(hù)可以使用trap命令修改進(jìn)程接收到終止信號(hào)時(shí)進(jìn)行的默認(rèn)操作。
    trap命令格式如下:
  
       trap command_string signals
  
  多數(shù)系統(tǒng)中共有15種發(fā)給進(jìn)程的信號(hào),默認(rèn)情況下大多數(shù)信號(hào)都會(huì)使程序終止。用戶(hù)最好查閱自己系統(tǒng)的文擋,看看本系統(tǒng)內(nèi)使用的信號(hào)種類(lèi)。除了信號(hào)為9(真正的kill信號(hào))不能使用trap命令外,其他信號(hào)所帶來(lái)的操作都可以用trap命令進(jìn)行指定。下面是trap命令中經(jīng)常使用的幾種信號(hào):
  
      信號(hào)   功能
      
       1     掛起
       2    操作中斷
       15    軟終止(kill信號(hào))
  
  若命令串中包含不只

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多