乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Linux bash總結(jié)(一) 基礎(chǔ)部分(適合初學(xué)者學(xué)習(xí)和非初學(xué)者參考)

       mingjiu 2016-09-25

       

      早上起來,外面的雨下的稀里嘩啦……本來事先約定好的朋友聚餐也因此取消了。
      心想,閑著也是閑著,不如將自己所學(xué)的bash腳本知識(shí)梳理一遍。一來,可以給bash初學(xué)者提供一個(gè)學(xué)習(xí)平臺(tái);再者,非初學(xué)者書寫腳本時(shí),也能以此為參考。若您在閱讀時(shí),文章能給您一點(diǎn)點(diǎn)啟發(fā),那我的目的就達(dá)到了。

      花了3天功夫,終于整理完畢了??赡苓€有許多需要完善的地方,希望讀者能給出寶貴的意見!鑒于文章內(nèi)容比較多,下面先介紹一下主要內(nèi)容。

      第一部分 bash簡(jiǎn)介
          —— 對(duì)bash進(jìn)行簡(jiǎn)要介紹
      第二部分 bash示例和書寫流程
          —— 以一個(gè)簡(jiǎn)單的bash為例,說明書寫、執(zhí)行bash的流程
      第三部分 bash基礎(chǔ)語法
         —— 本章內(nèi)容比較多,主要介紹if...else...條件判斷,for循環(huán)等等。對(duì)于有編程基礎(chǔ)的朋友來說應(yīng)該很容易,沒有編程基礎(chǔ)也沒關(guān)系;參考文章中的實(shí)例,應(yīng)該很容易就能掌握本章知識(shí)。
      第四部分 bash數(shù)組
         —— 介紹bash數(shù)組的定義和相關(guān)操作
      第五部分 函數(shù)
         —— 介紹bash函數(shù)的定義及調(diào)用方法
      第六部分 數(shù)值運(yùn)算
         —— 介紹+、-、*、/等操作
      第七部分 字符運(yùn)算
         —— 介紹字符串操作
      第八部分 bash自帶參數(shù)
         —— 說明bash中自帶的參數(shù),它們?cè)诰帉慴ash腳本時(shí)中經(jīng)常會(huì)被用到。
      第九部分 bash調(diào)試
         —— 說明bash常用的調(diào)試方法
      第十部分 bash注釋
         —— 說明bash中添加單行注釋以及區(qū)域注釋的常用方法
      第十一部分 bash內(nèi)建指令
         —— 介紹bash中常用的內(nèi)建命令
      第十二部分 bash實(shí)例
         —— 以一個(gè)實(shí)例來總結(jié)基礎(chǔ)部分

       

      第一部分 bash簡(jiǎn)介

      在介紹bash之前,需要先介紹它的起源——shell。shell俗稱殼,它是指UNIX系統(tǒng)下的一個(gè)命令解析器;主要用于用戶和系統(tǒng)的交互。UNIX系統(tǒng)上有很多種Shell。首個(gè)shell,即Bourne Shell,于1978年在V7(AT&T的第7版)UNIX上推出。后來,又演變出C shell、bash等不同版本的shell。
      bash,全稱為Bourne-Again Shell。它是一個(gè)為GNU項(xiàng)目編寫的Unix shell。bash腳本功能非常強(qiáng)大,尤其是在處理自動(dòng)循環(huán)或大的任務(wù)方面可節(jié)省大量的時(shí)間。bash是許多Linux平臺(tái)的內(nèi)定Shell,這也是我們介紹它主要的原因。

       

      第二部分 bash示例和書寫流程

      1 新建文件test.sh

      $ touch test.sh

      2 添加可執(zhí)行權(quán)限

      $ chmod +x test.sh

      3 編輯test.sh,test.sh內(nèi)容如下:

      #!/bin/bash
      
      echo "hello bash"
      
      exit 0

      說明:
      #!/bin/bash : 它是bash文件聲明語句,表示是以/bin/bash程序執(zhí)行該文件。它必須寫在文件的第一行!
      echo "hello bash" : 表示在終端輸出“hello bash”
      exit 0 : 表示返回0。在bash中,0表示執(zhí)行成功,其他表示失敗。
      4 執(zhí)行bash腳本

      $ ./bash

      在終端輸出“bash hello”

       

       

      第三部分 bash基礎(chǔ)語法

      1 條件判斷

      條件判斷有2中格式,分別是“test EXPRESSION”和“[ EXPRESSION ]”。
      “test”判斷語句,在實(shí)際中應(yīng)用的比較少;相反的,“[]”判斷語句應(yīng)用很廣。下面分別對(duì)它們進(jìn)行介紹

      1.1 test判斷語句

      基本格式

      test EXPRESSION

      格式說明

      test是關(guān)鍵字,表示判斷;
      EXPRESSION是被判斷的語句。
      關(guān)于EXPRESSION的說明,參考如下:

      應(yīng)用實(shí)例

      一、判斷文件/home/skywang/123.txt是不是文件

      $ test -f /home/skywang/123.txt

      其他說明

      在linux系統(tǒng)下,可以通過以下命令去測(cè)試上面的實(shí)例
      # 切換到執(zhí)行目錄(如切換到/home/skywang)

      $ cd /home/skywang

      # 判斷123.txt是不是文件

      $ test -f 123.txt

      # 輸出判斷結(jié)果,0表示成功,其他表示失敗。
      # 其中,echo表示輸出文本到當(dāng)前終端,$?表示上一命令的執(zhí)行結(jié)果(在linux中bash中,命令成功返回0,失敗返回其他)。

      $ echo $?


      1.2 []條件判斷

      基本格式

      [ EXPRESSION ]

      格式說明
      中括號(hào)的左右擴(kuò)弧和EXPRESSION之間都必須有空格!
      關(guān)于EXPRESSION的說明,參考如下:

      應(yīng)用實(shí)例
      一、判斷文件/home/skywang/123.txt是否存在

      $ [ -f /home/skywang/123.txt ]

      二、判斷變量val是否等于字符串“skywang”

      $ [ "$val" = "skywang" ]

      三,判斷變量num是否等于數(shù)字100

      $ [ "$num" -eq "100" ]


      1.3 測(cè)試邏輯表達(dá)式

      基本格式
      -a : 邏輯與,操作符兩邊均為真,結(jié)果為真,否則為假。
      -o : 邏輯或,操作符兩邊一邊為真,結(jié)果為真,否則為假。
      ! : 邏輯否,條件為假,結(jié)果為真。
      應(yīng)用實(shí)例
      一、判斷文件123.txt是不是可讀寫

      $ [ -r 123.txt -a -w 123.txt ]

      等價(jià)于

      $ [ -r 123.txt ] && [ -w 123.txt ]

      二、判斷變量num是不是等于數(shù)字101或102

      $ [ "$num" -eq "101" -o "$num" -eq "102" ]

      等價(jià)于

      $ [ -r 123.txt ] || [ -w 123.txt ]

      三、判斷文件123.txt是不是不可讀

      $ [ ! -r 123.txt ]

      2 if then else語句

      基本格式
      if 條件1
      then 命令1
      elif 條件2
      then 命令2
      else 命令3
      if
      格式說明
      if 語句必須以單詞 fi 終止。elif 和 else 為可選項(xiàng),如果語句中沒有否則部分,那么就不需要 elif 和 else 部分。if 語句可以有許多 elif 部分。最常用的 if 語句是 if then fi 結(jié)構(gòu)。
      應(yīng)用實(shí)例
      一、判斷文件文件123.txt是否存在,存在則輸出“file exist”;沒有則輸出“file not exist”。bash文件內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      if [ -f 123.txt ];then
      echo "file exist"
      else
      echo "file not exist"
      fi
      
      exit 0
      復(fù)制代碼

      二、提示用戶輸入值。若輸入的值小于0,則輸出“negtive number”;若等于0,則輸出“number zero”,否則,輸出“positive number”。bash文件內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash 
      
      # 提示用戶輸入一個(gè)值 
      echo -n "please input a number:"
      
      # 保存用戶輸入的值到num中 
      read num 
      
      if [ "$num" -lt "0" ];then 
      # 小于0,則輸出“negtive number” 
      echo "negtive number" 
      elif [ "$num" -gt "0" ];then 
      # 大于0,則輸出“positive number” 
      echo "positive number" 
      else
      # 大于0,則輸出"number zero" 
      echo "number zero"
      fi
      
      exit 0
      復(fù)制代碼

      3 case語句

      case語句為多選擇語句。可以用case語句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行相匹配的命令。
      基本格式
      case 值 in
      模式1}
      命令1
      ...
      ;;
      模式2)
      命令2
      ...
      ;;
      esac
      格式說明
      “模式”部分可能包括元字符,即:
      * 任意字符。
      任意單字符。
      [..] 類或范圍中任意字符
      應(yīng)用實(shí)例
      一、提示用戶輸入Y/y或N/n。若輸入Y/y,則輸出“yes”;若輸入N/n,則輸出“no”;否則,“incorrect input”。bash文件內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      # 提示用戶輸入一個(gè)值
      echo -n "are you femail(Y/N):"
      
      # 保存用戶輸入的值到val中
      read val
      
      case $val in
      Y|y) 
      # 用戶輸入Y或y 
      echo "yes"
      ;;
      N|n)
      # 用戶輸入N或n
      "no"
      ;; 
      *)
      # 其它輸入
      echo "incorrect input"
      ;; 
      esac 
      
      exit 0
      復(fù)制代碼

       

      4 for循環(huán)

      基本格式
      for 變量名in列表
      do
      命令1
      命令2...
      done
      格式說明
      當(dāng)變量值在列表里, for循環(huán)即執(zhí)行一次所有命令,使用變量名訪問列表中取值。命令可為任何有效的 shell命令和語句。變量名為任何單詞。 in列表用法是可選的,如果不用它, for循環(huán)使用命
      令行的位置參數(shù)。
      應(yīng)用實(shí)例
      一、輸入當(dāng)前文件夾的一級(jí)子目錄中文件名字。bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      # 將ls的結(jié)果保存到變量CUR_DIR中
      CUR_DIR=`ls`
      
      # 顯示ls的結(jié)果
      echo $CUR_DIR
      
      for val in $CUR_DIR
      do
      # 若val是文件,則輸出該文件名
      if [ -f $val ];then
      echo "FILE: $val"
      fi 
      done
      
      exit 0
      復(fù)制代碼

       

      二、輸出1-10之間數(shù)字的總和。bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      sum=0
      for ((i=1;i<10;i++)) 
      do 
      ((sum=$sum+$i))
      done 
      
      echo "sum=$sum" 
      
      exit 0
      復(fù)制代碼

        

      5 until循環(huán)

      until循環(huán)執(zhí)行一系列命令直至條件為真時(shí)停止。until循環(huán)與 while循環(huán)在處理方式上剛好相反。一般 while循環(huán)優(yōu)于until循環(huán),但在某些時(shí)候 — 也只是極少數(shù)情況下, until循環(huán)更加有用。
      基本格式
      until 條件
      命令1
      ...
      done
      格式說明
      條件可為任意測(cè)試條件,測(cè)試發(fā)生在循環(huán)末尾,因此循環(huán)至少執(zhí)行一次 — 請(qǐng)注意這一點(diǎn)。
      應(yīng)用實(shí)例
      一、從0開始逐步遞增,當(dāng)數(shù)值等于5時(shí),停止遞增。Bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash 
      
      # 設(shè)置起始值為0
      val=0
      
      until [ "$val" -eq "5" ]
      do
      # 輸出數(shù)值
      echo "val=$val"
      # 將數(shù)值加1
      ((val++))
      done
      
      exit 0
      復(fù)制代碼

       

      6 while循環(huán)

      基本格式
      while 命令
      do
      命令1
      命令2
      ...
      done
      應(yīng)用實(shí)例
      一、從0開始逐步遞增,當(dāng)數(shù)值等于5時(shí),停止遞增。Bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash 
      
      # 設(shè)置起始值為0
      val=0
      
      while [ "$val" -lt "5" ]
      do
      # 輸出數(shù)值
      echo "val=$val"
      # 將數(shù)值加1
      ((val++))
      done
      
      exit 0
      復(fù)制代碼


      7 使用break和continue控制循環(huán)

      基本格式
      break命令允許跳出循環(huán)。
      continue命令類似于 break命令,只有一點(diǎn)重要差別,它不會(huì)跳出循環(huán),只是跳過這個(gè)循環(huán)步。
      應(yīng)用實(shí)例
      一、[break應(yīng)用]從0開始逐步遞增,當(dāng)數(shù)值等于5時(shí),停止遞增。Bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      # 設(shè)置起始值為0
      val=0
      
      while true
      do
      if [ "$val" -eq "5" ];then
      # 如果val=5,則跳出循環(huán)
      break;
      else
      # 輸出數(shù)值
      echo "val=$val"
      # 將數(shù)值加1
      ((val++))
      fi 
      done
      
      exit 0
      復(fù)制代碼

       

      二、[continue應(yīng)用]從0開始逐步遞增到10:當(dāng)數(shù)值為5時(shí),將數(shù)值遞增2;否則,輸出數(shù)值。Bash腳本內(nèi)容如下:

      復(fù)制代碼
      #!/bin/bash
      
      # 設(shè)置起始值為0
      val=0
      
      while [ "$val" -le "10" ]
      do
      if [ "$val" -eq "5" ];then
      # 如果val=5,則將數(shù)值加2
      ((val=$val+2))
      continue;
      else
      # 輸出數(shù)值
      echo "val=$val"
      # 將數(shù)值加1
      ((val++))
      fi 
      done
      
      exit 0
      復(fù)制代碼

       

      第四部分 bash數(shù)組

      1 數(shù)組定義

      1. array=(10 20 30 40 50)
      一對(duì)括號(hào)表示是數(shù)組,數(shù)組元素用“空格”符號(hào)分割開。引用數(shù)組時(shí)從序號(hào)0開始。

      2. 除了上面的定義方式外,也可以單獨(dú)定義數(shù)組:
      array[0]=10
      array[1]=20
      array[2]=30
      array[3]=40
      array[4]=50

      3. var="10 20 30 40 50"; array=($var)


      2 數(shù)組操作

      (01) 顯示數(shù)組中第2項(xiàng)

      $ echo ${array[i]}
      說明:數(shù)組是從序號(hào)0開始計(jì)算(即第1項(xiàng)為array[0])。

      (02) 顯示數(shù)組中的所有元素

      $ echo ${array[@]}
      或者
      $ echo ${array[*]}

      (03) 顯示數(shù)組長(zhǎng)度

      $ echo ${#array[@]}
      或者
      $ echo ${#array[*]}

      (04) 刪除數(shù)組第2項(xiàng)元素

      $ unset array[1]
      說明:
      unset僅僅只清除array[1]的值,并沒有將array[1]刪除掉

      (05) 刪除整個(gè)數(shù)組

      $ unset array

      (06) 輸出數(shù)組的第1-3項(xiàng)

      $ echo ${array[@]:0:3}
      說明:
      參考“${數(shù)組名[@或*]:起始位置:長(zhǎng)度}”

      (07) 將數(shù)組中的0替換成1

      $ echo ${a[@]/0/1}
      說明:
      ${數(shù)組名[@或*]/查找字符/替換字符

       

      第五部分 函數(shù)

      1 函數(shù)定義

      基本格式
      function 函數(shù)名()
      {
      ...
      }

      格式說明
      function可有可無。但建議保留,因?yàn)楸A舻脑捒雌饋砀又庇^。

      應(yīng)用實(shí)例

      復(fù)制代碼
      function foo()
      {
          # 定義局部變量i
          local i=0 
          # 定義局部變量total=傳入foo的參數(shù)總數(shù)
          local total=$#
          # 輸出參數(shù)總數(shù)
          echo "total param =$total"
          # 輸出傳入foo的每一個(gè)參數(shù)
          for val in $@
          do  
              ((i++))
              echo "$i -- val=$val"
          done
      
          # 返回參數(shù)總數(shù)
          return $total
      }
      復(fù)制代碼

      2 函數(shù)調(diào)用和傳參

      調(diào)用方法

      直接通過函數(shù)名去調(diào)用。

      應(yīng)用實(shí)例

      foo param1 param2 param3

      說明:

      調(diào)用函數(shù)foo,并傳入param1 param2 param3三個(gè)參數(shù)

      3 函數(shù)返回值

      使用方法

      return 返回值

      方法說明

      例如,foo param1 param2 param3之后,再調(diào)用$?就是上次調(diào)用的返回值

       

      4 應(yīng)用實(shí)例

      編輯一個(gè)函數(shù)foo:打印foo的輸入?yún)?shù)的總數(shù),并輸入每個(gè)參數(shù)和參數(shù)對(duì)應(yīng)的序號(hào)。

      復(fù)制代碼
      #!/bin/bash
      
      function foo()
      {
          # 定義局部變量i
          local i=0 
          # 定義局部變量total=傳入foo的參數(shù)總數(shù)
          local total=$#
          # 輸出參數(shù)總數(shù)
          echo "total param =$total"
          # 輸出傳入foo的每一個(gè)參數(shù)
          for val in $@
          do  
              ((i++))
              echo "$i -- val=$val"
          done
      
          # 返回參數(shù)總數(shù)
          return $total
      }
      
      foo
      foo param1 param2 param3
      # 輸出foo param1 param2 param3的返回值
      echo "return value=$?"
      
      exit 0
      復(fù)制代碼

       

      輸出結(jié)果:

      total param =0
      total param =3
      1 -- val=param1
      2 -- val=param2
      3 -- val=param3
      return value=3

       

      第六部分 數(shù)值運(yùn)算

      數(shù)值比較請(qǐng)參考"第三部分"的1.2節(jié),本部分只介紹數(shù)值運(yùn)算。

      常用的4種數(shù)值運(yùn)算說明
      數(shù)值元算主要有4種實(shí)現(xiàn)方式:(())、let、expr、bc。
      工作效率:
      (()) == let > expr > bc
      (01), (())和let是bash內(nèi)建命令,執(zhí)行效率高;而expr和bc是系統(tǒng)命令,會(huì)消耗內(nèi)存,執(zhí)行效率低。
      (02), (())、let和expr只支持整數(shù)運(yùn)算,不支持浮點(diǎn)運(yùn)算;而bc支持浮點(diǎn)運(yùn)算。

      下面分別介紹這4種實(shí)現(xiàn)方式的使用方法。
      應(yīng)用實(shí)例一:分別用上面四種方式實(shí)現(xiàn)"3*(5+2)"。

      復(fù)制代碼
      #!/bin/bash
      
      # 數(shù)值i=3*(5+2) (方法一:$(())實(shí)現(xiàn))
      val=$((3*(5+2)))
      echo "val=$val"
      
      # 數(shù)值i=3*(5+2) (方法二:let實(shí)現(xiàn))
      let "val=3*(5+2)"
      echo "val=$val"
      
      # 數(shù)值i=3*(5+2) (方法三:expr實(shí)現(xiàn))
      val=`expr 3 \* \( 5 + 2 \)`
      echo "val=$val"
      
      # 數(shù)值i=3*(5+2) (方法四:bc實(shí)現(xiàn))
      val=`echo "3*(5+2)"|bc`
      echo "val=$val"
      
      exit 0
      復(fù)制代碼

      應(yīng)用實(shí)例二:分別勇上面四種方式實(shí)現(xiàn)“數(shù)值+1”。

      復(fù)制代碼
      #!/bin/bash
      
      val=0
      # 數(shù)值加1 (方法一)
      ((val++))
      echo "val=$val"
      
      val=0
      # 數(shù)值加1 (方法二)
      let val++
      echo "val=$val"
      
      val=0
      # 數(shù)值加1 (方法三)
      val=`expr $val + 1`
      echo "val=$val"
      
      val=0
      # 數(shù)值加1(方法四)
      val=`echo "$val+1"|bc`
      echo "val=$val"
      
      exit 0
      復(fù)制代碼

      應(yīng)用實(shí)例三:計(jì)算1/3,保留3位小數(shù)。

      復(fù)制代碼
      #!/bin/bash
      
      # 數(shù)值i=3*(5+2) (方法四:bc實(shí)現(xiàn))
      val=`echo "scale=3; 1/3"|bc`
      echo "val=$val"
      
      exit 0
      復(fù)制代碼

       

      第七部分 字符運(yùn)算

      1 字符串定義

       

      2 字符串操作

      2.1 string操作公式表

      2.2 應(yīng)用實(shí)例

      首先,我們定義個(gè)str字符串變量,然后再對(duì)此變量進(jìn)行字符串操作。

      $ str="hello world"

      (01) 顯示字符串長(zhǎng)度

      $ echo ${#str}

      (02) 提取world

      $ echo ${str:6}

      (03) 提取or

      $ echo ${str:7:2}

      (04) 刪除hello

      $ echo ${str#hello}
      或
      $ echo ${str#*lo}

      (05) 刪除world

      $ echo ${str%world}$ echo ${str%wo*}

      (06) 將所有的字符“l(fā)”替換為“m”

      $ echo ${str//l/m}

       

      第八部分 bash自帶參數(shù)

       

      第九部分 bash調(diào)試

      1 bash命令調(diào)試

      bash [-nvx] scripts.sh
      選項(xiàng)與參數(shù):
      -n :不要執(zhí)行 script,僅查詢語法的問題;
      -v :再執(zhí)行 sccript 前,先將 scripts 的內(nèi)容輸出到屏幕上;
      -x :將使用到的 script 內(nèi)容顯示到屏幕上,這是很有用的參數(shù)!
      例如,想要執(zhí)行bash腳本,并查看bash的調(diào)用流程,可以通過以下命令:

      $ bash -x test.sh

      2 echo調(diào)試
      echo [OPTION] STRING
      -n : 輸出內(nèi)容之后,不換行。默認(rèn)是輸入內(nèi)容之后,換行。
      -e : 開啟反斜線“\”轉(zhuǎn)義功能
      -E : 開啟反斜線“\”轉(zhuǎn)義功能(默認(rèn))。
      例如,輸出“please input a number:”之后不換行。

      $ echo -n "please input a number:"

      3 printf
      和echo一樣,printf也能用于輸出。語法格式和C語言中printf一樣。
      例如,輸出“hello printf”之后換行。

      $ printf "hello printf\n"

       

      第十部分 bash注釋

      1 單行注釋

      # echo "single line"
      說明:#放在文件開頭,表示注釋掉本行。

      2 多行注釋

      可以通過以下兩種方法實(shí)現(xiàn)多行注釋:

      :||{
      ....被注釋的多行內(nèi)容
      }

      或者

      if false ; then
      ....被注釋的多行內(nèi)容
      fi

       

      第十一部分 bash內(nèi)建指令

      1 內(nèi)建命令查看方法

      基本格式
      type cmd
      格式說明
      type是命令關(guān)鍵字,cmd表示查看的命令;若輸出builtin,則該命令是bash的內(nèi)建命令。
      例如:

      $ type echo

      除此之外,用戶也可以通過man bash或者man builtins查看bash的全部?jī)?nèi)置命令.

      2 常用內(nèi)建命令說明

      (01)echo
      命令:echo arg
      功能:在屏幕上顯示出由arg指定的字串
      (02)read
      命令格式:read變量名表
      功能:從標(biāo)準(zhǔn)輸入設(shè)備讀入一行,分解成若干字,賦值給bash程序內(nèi)部定義的變量
      (03)shift
      命令:shift [N] (N為大于0的整數(shù);當(dāng)N省略時(shí),等價(jià)與于“shift 1”)
      功能:所有的參數(shù)依次向左移動(dòng)N個(gè)位置,并使用$#減少N,直到$#=0為止。
      (04)alias
      命令:alias name='value'
      功能:別名。用name替換value,value要用單引號(hào)括住。
      (05)export
      命令:export變量名[=變量值]
      功能:export可以把bash的變量向下帶入子bash(即子bash中可以使用父bash的變量),從而讓子進(jìn)程繼承父進(jìn)程中的環(huán)境變量。但子bash不能用export把它的變量向上帶入父bash。
      (06)readonly
      命令:readonly 變量名
      功能:定義只讀變量。不帶任何參數(shù)的readonly命令將顯示出所有只讀變量。
      (07)exec
      命令:exec 命令參數(shù)
      功能:當(dāng)bash執(zhí)行到exec語句時(shí),不會(huì)去創(chuàng)建新的子進(jìn)程,而是轉(zhuǎn)去執(zhí)行指定的命令,當(dāng)指定的命令執(zhí)行完時(shí),該進(jìn)程(也就是最初的bash)就終止了,所以bash程序中exec后面的語句將不再
      被執(zhí)行。
      (08)"."(點(diǎn))
      命令:. bash程序文件名
      功能:使bash讀入指定的bash程序文件并依次執(zhí)行文件中的所有語句。
      (09)exit
      命令:exit N
      功能:退出Shell程序。在exit之后可有選擇地指定一個(gè)數(shù)位作為返回狀態(tài)。

       

      第十二部分 bash實(shí)例

      實(shí)例一:備份/更新文件的腳本
      01, 編寫一個(gè)腳本文件backup.sh,備份android、kernel或uboot中的文件,備份的時(shí)候要保留文件在備份文件夾(即保留文件的相對(duì)路徑)。
      (01) 新建list_file.txt,并在list_file.txt中記錄要備份的文件的路徑。
      (02) 當(dāng)執(zhí)行“./backup.sh bb”命令時(shí):backup.sh會(huì)新建bb目錄,然后讀取list_file.txt中記錄的文件路徑,并將記錄的文件路徑對(duì)應(yīng)的文件備份到bb目錄下。
      (03) 當(dāng)執(zhí)行“./backup.sh tt”命令時(shí),backup.sh會(huì)判斷是否存在tt目錄,若存在tt目錄的話,則tt中的文件更新到list_file.txt所記錄的文件路徑;否則的話,不更新文件。

      腳本內(nèi)容如下:

       

      復(fù)制代碼
      #!/bin/bash
      
      ##############################NOTE############################
      #
      # AUTHOR      : skyWang
      # DATE        : 2012-07-16
      # DESCRIPTION : 用于備份文件 or 更新文件
      #
      #               1. 備份文件
      #               (1) 備份命令        :  ./run.sh bb
      #               (2) 備份文件所在目錄:  bb
      #                   這個(gè)是在步驟(1)之后,在當(dāng)前目錄下自動(dòng)建立bb目錄
      #              
      #               2. 更新文件
      #               (1) 更新命令        :  ./run.sh tt
      #               (2) 更新文件所在目錄:  tt
      #                   這個(gè)是必須在步驟(1)之前已經(jīng)存在的目錄。因?yàn)?,就是為了用tt目錄中的文件去替換到目標(biāo)文件。
      #
      # OTHER       : 1. list_file.txt 文件說明(即,list_file.txt中的文件必須滿足一下條件):
      #               “變量COMMPATH_PATH的值”和“l(fā)ist_file.txt中的每一行內(nèi)容”組合起來得到的完整路徑所對(duì)應(yīng)的文件,必須存在!
      #
      #               例如: COMMON_PATH=/root/
      #                      list_file.txt中有以下1行內(nèi)容:
      #                      android/build/core/Makefile
      #               這樣,“變量COMMPATH_PATH的值”和“l(fā)ist_file.txt中的行”組合起來得到的完整路徑就是:
      #                      /root/android/build/core/Makefile
      #
      #                “/root/android/build/core/Makefile”這個(gè)文件必須存在于電腦中。
      #
      #               (1)若list_file.txt滿足以上條件,運(yùn)行“./run.sh bb”就可以備份“/root/android/build/core/Makefile”。
      #                    備份時(shí),會(huì)自動(dòng)(在當(dāng)前目錄下)建立目錄“bb”,并將文件備份到“bb”目錄下
      #               (2)若將bb目錄重命名成tt,運(yùn)行“./run.sh tt”就可以將“tt”中的文件更新到“/root/android/build/core/Makefile”。
      #               
      #
      ##############################NOTE############################
      
      
      #########TODO...START#########
      # 假設(shè)android、kernel、uboot在同一級(jí)目錄;
      # 則,COMMON_PATH是它們所在目錄的路徑。
      COMMON_PATH=/home/skywang/a8/gingerbread/code/
      #########TODO...END###########
      
      
      #########CONSTANT...START#########
      LIST_FILE="list_file.txt"
      B_FOLDER="bb/"
      T_FOLDER="tt/"
      # android工程的文件夾名字
      ANDROID_FOLDER="android"
      # kernel工程的文件夾名字
      KERNEL_FOLDER="kernel"
      # uboot工程的文件夾名字
      UBOOT_FOLDER="uboot"
      # android長(zhǎng)度
      ANDROID_FOLDER_LEN=`expr length "$ANDROID_FOLDER"`
      # kernel長(zhǎng)度
      KERNEL_FOLDER_LEN=`expr length "$KERNEL_FOLDER"`
      # uboot長(zhǎng)度
      UBOOT_FOLDER_LEN=`expr length "$UBOOT_FOLDER"`
      #########CONSTANT...END###########
      
      
      # 功能說明:根據(jù)源文件和目標(biāo)文件所在完整路徑,將源文件更新到目標(biāo)文件
      #           更新成功的話,輸出更新的起止路徑;否則,打印錯(cuò)誤信息
      # 輸入?yún)?shù):src_full_path    —— 源文件所在完整路徑。
      #           dst_full_path    —— 目標(biāo)文件所在完整路徑。
      #           例如:src_full_path="tt/android/hardware/libsensor/sensors.cpp"
      #                 dst_full_path="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/code/android/hardware/libsensor/sensors.cpp"
      function func_update_file_by_path()
      {
          local src_full_path=$1
          local dst_full_path=$2
          local dst_full_dir=`dirname $dst_full_path`
      
          if [ -f "$src_full_path" ];then
              if [ -e "$dst_full_path" ] || [ -d "$dst_full_dir" ];then
                  cp -v $src_full_path $dst_full_path
              else
                  mkdir -p $dst_full_dir
                  cp -v $src_full_path $dst_full_path
              fi
          else
              echo copy file ERROR:
              echo file $src_full_path not existes!!!
          fi
      }
      
      
      # 功能說明:將“輸入文件”中全部文件全部更新到代碼中
      #           更新成功的話,輸出更新的起止路徑;否則,打印錯(cuò)誤信息
      # 輸入?yún)?shù):input_file    ——    “輸入文件”所在的完整路徑
      #           例如:input_file="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/backup/exmaple/list_file.txt"
      function func_push_files()
      {
          local input_file=$1
          local full_path
          local backup_path
          local count=0
      
          while read -r line
          do
              let count=`expr $count + 1`
              if [ `expr match $line $ANDROID_FOLDER` == "$ANDROID_FOLDER_LEN" ] || 
                 [ `expr match $line $KERNEL_FOLDER` == "$KERNEL_FOLDER_LEN" ] || 
                 [ `expr match $line $UBOOT_FOLDER` == "$UBOOT_FOLDER_LEN" ];then
                  echo "$count : right push path"
                  src_path=${T_FOLDER}${line}
                  dst_path=${COMMON_PATH}${line}
                  func_update_file_by_path $src_path $dst_path
              else
                  echo "$count : push file $line is invalidate!"
              fi
          done < $input_file
      
      }
      
      
      # 功能說明:根據(jù)源文件所在完整路徑,將源文件拷貝到另一個(gè)目錄下
      #           備份成功的話,輸出備份的起止路徑;否則,打印錯(cuò)誤信息
      # 輸入?yún)?shù):src_full_path    —— 源文件所在完整路徑。
      #           dst_full_dir    —— 目標(biāo)路徑
      #           例如:src_full_path="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/code/android/hardware/libsensor/sensors.cpp"
      #                 dst_full_dir="bb/android/hardware/libsensor/"
      function func_backup_file_by_path()
      {
          local src_full_path=$1
          local dst_full_dir=$2"/"
      
          if [ -f "$src_full_path" ];then
              if [ -d "$dst_full_dir" ];then
                  cp -v $src_full_path $dst_full_dir
              else
                  mkdir -p $dst_full_dir
                  cp -v $src_full_path $dst_full_dir
              fi
          else
              echo backup file ERROR:
              echo file $src_full_path not existes!!!
          fi
      }
      
      # 功能說明:將“輸入文件”中全部文件全部做備份。
      #           備份成功的話,輸出備份的起止路徑;否則,打印錯(cuò)誤信息
      # 輸入?yún)?shù):input_file    ——    “輸入文件”所在的完整路徑
      #           例如:input_file="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/backup/exmaple/list_file.txt"
      function func_pull_files()
      {
          local input_file=$1
          local full_path
          local backup_path
          local count=0
      
          while read -r line
          do
              let count=`expr $count + 1`
              if [ `expr match $line $ANDROID_FOLDER` == "$ANDROID_FOLDER_LEN" ] || 
                 [ `expr match $line $KERNEL_FOLDER` == "$KERNEL_FOLDER_LEN" ] || 
                 [ `expr match $line $UBOOT_FOLDER` == "$UBOOT_FOLDER_LEN" ];then
                  echo "$count : right pull path"
                  full_path=${COMMON_PATH}${line}
                  backup_path=${B_FOLDER}`dirname $line`
                  func_backup_file_by_path $full_path $backup_path
              else
                  echo "$count : pull file $line is invalidate!"
              fi
          done < $input_file
      
      }
      
      func_copy_all_files()
      {
          if [ ! -e "$LIST_FILE" ];then
              echo ERROR: the file $LIST_FILE not existes!!!
              exit 1
          fi
      
      
          case $1 in
              BB|bb)
                  echo -e "\n\n==============backup files=============="
                  func_pull_files $LIST_FILE && exit 0
                  ;;
              TT|tt)
                  echo -e "\n\n==============syn    files=============="
                  func_push_files $LIST_FILE && exit 0
                  ;;
              *)
                  echo ERROR parameter: please input parameter \"bb\" to backup, or \"tt\" to update!!!
                  ;;
      
          esac
      }
      
      func_copy_all_files $1
      
      exit 0
      復(fù)制代碼

       

      點(diǎn)擊下載:bash實(shí)例

       

         

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

        類似文章 更多