歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Bash腳本15分鐘進階教程

Bash腳本15分鐘進階教程

日期:2017/3/1 9:45:07   编辑:Linux編程

這裡的技術技巧最初是來自谷歌的“Testing on the Toilet” (TOTT)。這裡是一個修訂和擴增版本。

腳本安全

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

  1. #!/bin/bash
  2. set-o nounset
  3. set-o errexit

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

  1. 引用未定義的變量(缺省值為“”)
  2. 執行失敗的命令被忽略

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

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

腳本函數

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

  1. ExtractBashComments(){
  2. egrep "^#"
  3. }
  4. cat myscript.sh |ExtractBashComments| wc
  5. comments=$(ExtractBashComments< myscript.sh)

還有一些例子:

  1. SumLines(){# iterating over stdin - similar to awk
  2. local sum=0
  3. local line=””
  4. while read line ;do
  5. sum=$((${sum}+ ${line}))
  6. done
  7. echo ${sum}
  8. }
  9. SumLines< data_one_number_per_line.txt
  10. log(){# classic logger
  11. local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: "
  12. echo "${prefix} $@">&2
  13. }
  14. log "INFO""a message"

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

變量注解

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

  1. local(函數內部變量)
  2. readonly(只讀變量)
  1. # a useful idiom: DEFAULT_VAL can be overwritten
  2. # with an environment variable of the same name
  3. readonly DEFAULT_VAL=${DEFAULT_VAL:-7}
  4. myfunc(){
  5. # initialize a local variable with the global default
  6. local some_var=${DEFAULT_VAL}
  7. ...
  8. }

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

  1. x=5
  2. x=6
  3. readonly x
  4. x=7# failure

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

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

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

  1. # both commands below print out: A-B-C-D
  2. echo "A-`echo B-\`echo C-\\\`echo D\\\`\``"
  3. echo "A-$(echo B-$(echo C-$(echo D)))"

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

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

操作符功能說明 || 邏輯or(僅雙中括號裡使用) && 邏輯and(僅雙中括號裡使用) < 字符串比較(雙中括號裡不需要轉移) -lt 數字比較 = 字符串相等 == 以Globbing方式進行字符串比較(僅雙中括號裡使用,參考下文) =~ 用正則表達式進行字符串比較(僅雙中括號裡使用,參考下文) -n 非空字符串 -z 空字符串 -eq 數字相等 -ne 數字不等

單中括號:

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

雙中括號

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

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-04/100750p2.htm

Copyright © Linux教程網 All Rights Reserved