<em id="pn7p8"><acronym id="pn7p8"><u id="pn7p8"></u></acronym></em>

    <th id="pn7p8"></th>

    <button id="pn7p8"></button>

      <dd id="pn7p8"></dd>
      <progress id="pn7p8"><track id="pn7p8"></track></progress>

      Linux培訓
      達內IT學院

      400-111-8989

      Linux Bash腳本的進階教程

      • 發布:Linux培訓
      • 來源:Linux資訊
      • 時間:2018-05-11 15:58

      今天小編要跟大家分享的文章是關于Linux Bash腳本的進階教程,這里的技術技巧最初是來自谷歌的“Testing on the Toilet”(TOTT)。這里是一個修訂和擴增版本。對Linux感興趣的小伙伴們趕快來看一下吧。

      腳本安全

      我的所有bash腳本都以下面幾句為開場白:

      #!/bin/bash

      set -o nounset

      set -o errexit

      這樣做會避免兩種常見的問題:

      1. 引用未定義的變量(缺省值為“”)

      2. 執行失敗的命令被忽略

      需要注意的是,有些Linux命令的某些參數可以強制忽略發生的錯誤,例如“mkdir -p” 和 “rm -f”。

      還要注意的是,在“errexit”模式下,雖然能有效的捕捉錯誤,但并不能捕捉全部失敗的命令,在某些情況下,一些失敗的命令是無法檢測到的。(更多細節請參考這個帖子。)

      腳本函數

      在bash里你可以定義函數,它們就跟其它命令一樣,可以隨意的使用;它們能讓你的腳本更具可讀性:

      ExtractBashComments() {

      egrep "^#"

      }

      cat myscript.sh | ExtractBashComments | wc

      comments=$(ExtractBashComments < myscript.sh)

      還有一些例子:

      SumLines() {

      # iterating over stdin - similar to awk

      local sum=0

      local line=””

      while read line ; do

      sum=$((${sum} + ${line}))

      done

      echo ${sum}

      }

      SumLines < data_one_number_per_line.txt

      log() {

      # classic logger

      local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: "

      echo "${prefix} $@" >&2

      }

      log "INFO" "a message"

      盡可能的把你的bash代碼移入到函數里,僅把全局變量、常量和對“main”調用的語句放在最外層。

      變量注解

      Bash里可以對變量進行有限的注解。最重要的兩個注解是:

      1. local(函數內部變量)

      2. readonly(只讀變量)

      # a useful idiom: DEFAULT_VAL can be overwritten

      # with an environment variable of the same name

      readonly DEFAULT_VAL=${DEFAULT_VAL:-7}

      myfunc() {

      # initialize a local variable with the global default

      local some_var=${DEFAULT_VAL}

      ...

      }

      這樣,你可以將一個以前不是只讀變量的變量聲明成只讀變量:

      x=5

      x=6

      readonly x

      x=7

      # failure

      盡量對你bash腳本里的所有變量使用local或readonly進行注解。

      用$()代替反單引號(`)

      反單引號很難看,在有些字體里跟正單引號很相似。$()能夠內嵌使用,而且避免了轉義符的麻煩。

      # both commands below print out: A-B-C-D

      echo "A-`echo B-\`echo C-\\\`echo D\\\`\``"

      echo "A-$(echo B-$(echo C-$(echo D)))"

      用[[]](雙層中括號)替代[]

      使用[[]]能避免像異常的文件擴展名之類的問題,而且能帶來很多語法上的改進,而且還增加了很多新功能:

      Linux Bash腳本的進階教程

      單中括號:

      [ "${name}" \> "a" -o ${name} \< "m" ]

      雙中括號

      [[ "${name}" > "a" && "${name}" < "m" ]]

      正則表達式/Globbing

      使用雙中括號帶來的好處用下面幾個例子最能表現:

      t="abc123"

      [[ "$t" == abc* ]]

      # true (globbing比較)

      [[ "$t" == "abc*" ]]

      # false (字面比較)

      [[ "$t" =~ [abc]+[123]+ ]]

      # true (正則表達式比較)

      [[ "$t" =~ "abc*" ]]

      # false (字面比較)

      注意,從bash 3.2版開始,正則表達式和globbing表達式都不能用引號包裹。如果你的表達式里有空格,你可以把它存儲到一個變量里:

      r="a b+"

      [[ "a bbb" =~ $r ]]

      # true

      按Globbing方式的字符串比較也可以用到case語句中:

      case $t in

      abc*) <action> ;;

      esac

      字符串操作

      Bash里有各種各樣操作字符串的方式,很多都是不可取的。

      基本用戶

      f="path1/path2/file.ext"

      len="${#f}" # = 20 (字符串長度)

      #切片操作: ${<var>:<start>} or ${<var>:<start>:<length>}

      slice1="${f:6}"

      # = "path2/file.ext"

      slice2="${f:6:5}"

      # = "path2"

      slice3="${f: -8}"

      # = "file.ext"(注意:"-"前有空格)

      pos=6

      len=5

      slice4="${f:${pos}:${len}}"

      # = "path2"

      替換操作(使用globbing)

      f="path1/path2/file.ext"

      single_subst="${f/path?/x}"

      # = "x/path2/file.ext"

      global_subst="${f//path?/x}"

      # = "x/x/file.ext"

      #字符串拆分

      readonly DIR_SEP="/"

      array=(${f//${DIR_SEP}/ })

      second_dir="${arrray[1]}"

      # = path2

      刪除頭部或尾部(使用globbing)

      f="path1/path2/file.ext"

      #刪除字符串頭部

      extension="${f#*.}" # = "ext"

      #以貪婪匹配方式刪除字符串頭部

      filename="${f##*/}" # = "file.ext"

      #刪除字符串尾部

      dirname="${f%/*}"

      # = "path1/path2"

      #以貪婪匹配方式刪除字符串尾部

      root="${f%%/*}"

      # = "path1"

      避免使用臨時文件

      有些命令需要以文件名為參數,這樣一來就不能使用管道。這個時候?<()?就顯出用處了,它可以接受一個命令,并把它轉換成可以當成文件名之類的什么東西:

      # 下載并比較兩個網頁

      diff <(wget -O - url1) <(wget -O - url2)

      還有一個非常有用處的是”here documents”,它能讓你在標準輸入上輸入多行字符串。下面的’MARKER’可以替換成任何字詞。

      # 任何字詞都可以當作分界符

      command << MARKER

      ...

      ${var}

      $(cmd)

      ...

      MARKER

      如果文本里沒有內嵌變量替換操作,你可以把第一個MARKER用單引號包起來:

      command << 'MARKER'

      ...

      no substitution is happening here.

      $ (dollar sign) is passed through verbatim.

      ...

      MARKER

      內置變量

      Linux Bash腳本的進階教程

      提示

      使用$*很少是正確的選擇。

      $@能夠處理空格參數,而且參數間的空格也能正確的處理。

      使用$@時應該用雙引號括起來,像”$@”這樣。

      調試

      對腳本進行語法檢查:

      bash -n myscript.sh

      跟蹤腳本里每個命令的執行:

      bash -v myscripts.sh

      跟蹤腳本里每個命令的執行并附加擴充信息:

      bash -x myscript.sh

      你可以在腳本頭部使用set -o verbose和set -o xtrace來永久指定-v和-o。當在遠程機器上執行腳本時,這樣做非常有用,用它來輸出遠程信息。

      什么時候不應該使用bash腳本

      · 你的腳本太長,多達幾百行

      · 你需要比數組更復雜的數據結構

      · 出現了復雜的轉義問題

      · 有太多的字符串操作

      · 不太需要調用其它程序和跟其它程序管道交互

      · 擔心性能

      這個時候,你應該考慮一種腳本語言,比如Python或Ruby。

      以上就是小編今天為大家介紹的關于Linux Bash腳本的進階教程,希望本篇文章能夠對你有所幫助,想要了解更多Linux相關信息,歡迎關注達內Linux培訓官網。

      參考

      · Advanced Bash-Scripting Guide:?http://tldp.org/LDP/abs/html/

      · Bash Reference Manual

      來自:外刊IT評論

      鏈接:http://www.vaikan.com/bash-scripting

      預約申請免費試聽課

      填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

      上一篇:為你介紹Linux 內存的分配和釋放
      下一篇:為你解讀Linux 是如何成功運作的

      關于Linux系統中Bash腳本的進階教程

      Linux云計算未來發展怎么樣?

      達內12月份Linux云計算、網絡運維與安全兩大免費訓練營

      達內11月份Linux云計算、網絡運維與安全兩大免費訓練營

      • 掃碼領取資料

        回復關鍵字:視頻資料

        免費領取 達內課程視頻學習資料

      • 視頻學習QQ群

        添加QQ群:1143617948

        免費領取達內課程視頻學習資料

      Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

      選擇城市和中心
      黑龍江省

      吉林省

      河北省

      湖南省

      貴州省

      云南省

      廣西省

      海南省

      高清特黄a大片,日本真人真做爰,特级做人爱C级,免费a级毛片 百度 好搜 搜狗
      <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>