国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Bash腳本15分鐘進(jìn)階教程

開(kāi)發(fā) 開(kāi)發(fā)工具 前端
這里的技術(shù)技巧最初是來(lái)自谷歌的“Testing on the Toilet” (TOTT)。這里是一個(gè)修訂和擴(kuò)增版本。

這里的技術(shù)技巧最初是來(lái)自谷歌的“Testing on the Toilet” (TOTT)。這里是一個(gè)修訂和擴(kuò)增版本。

腳本安全

我的所有bash腳本都以下面幾句為開(kāi)場(chǎng)白:

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

這樣做會(huì)避免兩種常見(jiàn)的問(wèn)題:

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

需要注意的是,有些Linux命令的某些參數(shù)可以強(qiáng)制忽略發(fā)生的錯(cuò)誤,例如“mkdir -p” 和 “rm -f”。

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

腳本函數(shù)

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

  1. ExtractBashComments() {  
  2.     egrep "^#" 
  3. }   
  4.  
  5. cat myscript.sh | ExtractBashComments | wc   
  6.  
  7. 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.  
  10. SumLines < data_one_number_per_line.txt   
  11.  
  12. log() {  # classic logger  
  13.    local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: " 
  14.    echo "${prefix} $@" >&2 
  15. }   
  16.  
  17. log "INFO" "a message" 

盡可能的把你的bash代碼移入到函數(shù)里,僅把全局變量、常量和對(duì)“main”調(diào)用的語(yǔ)句放在最外層。

變量注解

Bash里可以對(duì)變量進(jìn)行有限的注解。最重要的兩個(gè)注解是:

  1. local(函數(shù)內(nèi)部變量)
  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.  
  5. myfunc() {  
  6.    # initialize a local variable with the global default  
  7.    local some_var=${DEFAULT_VAL}  
  8.    ...  

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

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

盡量對(duì)你bash腳本里的所有變量使用localreadonly進(jìn)行注解。

$()代替反單引號(hào)(`)

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

  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)))" 

[[]](雙層中括號(hào))替代[]

使用[[]]能避免像異常的文件擴(kuò)展名之類(lèi)的問(wèn)題,而且能帶來(lái)很多語(yǔ)法上的改進(jìn),而且還增加了很多新功能:

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

單中括號(hào):

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

雙中括號(hào)

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

正則表達(dá)式/Globbing

使用雙中括號(hào)帶來(lái)的好處用下面幾個(gè)例子最能表現(xiàn):

  1. t="abc123" 
  2. [[ "$t" == abc* ]]         # true (globbing比較)  
  3. [[ "$t" == "abc*" ]]       # false (字面比較)  
  4. [[ "$t" =~ [abc]+[123]+ ]] # true (正則表達(dá)式比較)  
  5. [[ "$t" =~ "abc*" ]]       # false (字面比較) 

注意,從bash 3.2版開(kāi)始,正則表達(dá)式和globbing表達(dá)式都不能用引號(hào)包裹。如果你的表達(dá)式里有空格,你可以把它存儲(chǔ)到一個(gè)變量里:

  1. r="a b+" 
  2. [[ "a bbb" =~ $r ]]        # true 

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

  1. case $t in  
  2. abc*)  <action> ;;  
  3. esac 

#p#

字符串操作

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

基本用戶(hù)

  1. f="path1/path2/file.ext"    
  2.  
  3. len="${#f}" # = 20 (字符串長(zhǎng)度)   
  4.  
  5. # 切片操作: ${<var>:<start>} or ${<var>:<start>:<length>}  
  6. slice1="${f:6}" # = "path2/file.ext" 
  7. slice2="${f:6:5}" # = "path2" 
  8. slice3="${f: -8}" # = "file.ext"(注意:"-"前有空格)  
  9. pos=6 
  10. len=5 
  11. slice4="${f:${pos}:${len}}" # = "path2" 

替換操作(使用globbing)

  1. f="path1/path2/file.ext"    
  2.  
  3. single_subst="${f/path?/x}"   # = "x/path2/file.ext" 
  4. global_subst="${f//path?/x}"  # = "x/x/file.ext"   
  5.  
  6. # 字符串拆分  
  7. readonly DIR_SEP="/" 
  8. array=(${f//${DIR_SEP}/ })  
  9. second_dir="${arrray[1]}"     # = path2 

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

  1. f="path1/path2/file.ext"   
  2.  
  3. # 刪除字符串頭部  
  4. extension="${f#*.}"  # = "ext"   
  5.  
  6. # 以貪婪匹配方式刪除字符串頭部  
  7. filename="${f##*/}"  # = "file.ext"   
  8.  
  9. # 刪除字符串尾部  
  10. dirname="${f%/*}"    # = "path1/path2"   
  11.  
  12. # 以貪婪匹配方式刪除字符串尾部  
  13. root="${f%%/*}"      # = "path1" 

避免使用臨時(shí)文件

有些命令需要以文件名為參數(shù),這樣一來(lái)就不能使用管道。這個(gè)時(shí)候 <() 就顯出用處了,它可以接受一個(gè)命令,并把它轉(zhuǎn)換成可以當(dāng)成文件名之類(lèi)的什么東西:

  1. # 下載并比較兩個(gè)網(wǎng)頁(yè)  
  2. diff <(wget -O - url1) <(wget -O - url2)  

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

 

  1. # 任何字詞都可以當(dāng)作分界符  
  2. command  << MARKER  
  3. ...  
  4. ${var}  
  5. $(cmd)  
  6. ...  
  7. MARKER 

 

如果文本里沒(méi)有內(nèi)嵌變量替換操作,你可以把***個(gè)MARKER用單引號(hào)包起來(lái):

  1. command << 'MARKER' 
  2. ...  
  3. no substitution is happening here.  
  4. $ (dollar sign) is passed through verbatim.  
  5. ...  
  6. MARKER 

內(nèi)置變量

變量 說(shuō)明
$0 腳本名稱(chēng)
$n 傳給腳本/函數(shù)的第n個(gè)參數(shù)
$$ 腳本的PID
$! 上一個(gè)被執(zhí)行的命令的PID(后臺(tái)運(yùn)行的進(jìn)程)
$? 上一個(gè)命令的退出狀態(tài)(管道命令使用${PIPESTATUS})
$# 傳遞給腳本/函數(shù)的參數(shù)個(gè)數(shù)
$@ 傳遞給腳本/函數(shù)的所有參數(shù)(識(shí)別每個(gè)參數(shù))
$* 傳遞給腳本/函數(shù)的所有參數(shù)(把所有參數(shù)當(dāng)成一個(gè)字符串)

提示
使用$*很少是正確的選擇。
$@能夠處理空格參數(shù),而且參數(shù)間的空格也能正確的處理。
使用$@時(shí)應(yīng)該用雙引號(hào)括起來(lái),像”$@”這樣。

調(diào)試

對(duì)腳本進(jìn)行語(yǔ)法檢查:

  1. bash -n myscript.sh 

跟蹤腳本里每個(gè)命令的執(zhí)行:

  1. bash -v myscripts.sh 

跟蹤腳本里每個(gè)命令的執(zhí)行并附加擴(kuò)充信息:

 

  1. bash -x myscript.sh 

 

你可以在腳本頭部使用set -o verboseset -o xtrace來(lái)***指定-v-o。當(dāng)在遠(yuǎn)程機(jī)器上執(zhí)行腳本時(shí),這樣做非常有用,用它來(lái)輸出遠(yuǎn)程信息。

什么時(shí)候不應(yīng)該使用bash腳本

  • 你的腳本太長(zhǎng),多達(dá)幾百行
  • 你需要比數(shù)組更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
  • 出現(xiàn)了復(fù)雜的轉(zhuǎn)義問(wèn)題
  • 有太多的字符串操作
  • 不太需要調(diào)用其它程序和跟其它程序管道交互
  • 擔(dān)心性能

這個(gè)時(shí)候,你應(yīng)該考慮一種腳本語(yǔ)言,比如Python或Ruby。

參考

英文原文:Better Bash Scripting in 15 Minutes

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

責(zé)任編輯:林師授 來(lái)源: 外刊IT評(píng)論 編譯
相關(guān)推薦

2018-04-24 14:52:48

LinuxBash腳本

2018-09-05 15:00:31

LinuxBash腳本

2017-09-20 12:44:23

LinuxBash用法及案例

2021-07-15 06:43:11

Bash調(diào)試腳本

2022-06-17 08:05:28

Grafana監(jiān)控儀表盤(pán)系統(tǒng)

2013-06-27 09:41:19

LuaLua語(yǔ)言Lua語(yǔ)言快速入門(mén)

2013-05-03 10:57:09

泛型泛型教程

2020-10-19 18:07:00

云計(jì)算技術(shù)應(yīng)用

2017-09-27 11:00:50

LinuxBash使用技巧

2019-08-01 14:35:19

Bash腳本技巧

2018-04-20 16:43:23

2011-07-11 09:58:52

2018-01-16 10:11:11

Nginx訪問(wèn)日志

2015-04-21 17:35:29

代碼

2022-07-27 15:50:55

漏洞網(wǎng)絡(luò)攻擊

2015-07-08 09:43:22

程序員

2013-12-19 09:20:59

2024-11-07 16:09:53

2021-03-03 11:36:57

Java 8Java 15Java

2012-06-28 10:26:51

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲主播在线| 亚洲激情77| 国产精品美女久久久久aⅴ国产馆| 亚洲国产成人av网| 在线视频福利一区| 国产伦乱精品| 欧美日韩国产一区二区三区地区| 国产精品久久久久久久久久久久久久 | 久久久男人天堂| 国产丝袜欧美中文另类| 精品999在线观看| 中文字幕亚洲影视| 亚洲精品视频在线播放| 久久经典视频| 亚洲精品国产成人久久av盗摄| 国产精品成av人在线视午夜片| 久久久久国产一区| 国产精品原创巨作av| 欧美黑人3p| 久久久精品久久久久久96| 久久久久久久久久久国产| av不卡高清| 欧美日韩精品一区视频| 日本高清中文字幕| 久久综合狠狠综合久久综合88| 久久影视电视剧免费网站| 黄色视屏免费在线观看| 亚洲午夜在线视频| 色视频网站在线观看| 久久久精品2019中文字幕之3| 国产女同一区二区| 亚洲日本一区二区三区在线| 国产午夜精品一区理论片飘花| 成人在线免费播放视频| 国产精品一区二区久久不卡| 一区二区三区国| 欧美综合二区| 日韩免费av电影| 日韩专区欧美专区| 亚洲精品人成| 青青草国产成人av片免费| 欧美日韩视频在线一区二区观看视频| 欧美啪啪网站| 久久精品视频播放| 国产高清精品二区| 久久久久久久久久久免费| 国产日韩中文在线中文字幕| 理论片在线不卡免费观看| 91精品亚洲一区在线观看| 久久久www成人免费精品| 国产成人77亚洲精品www| 久久精品人人爽| 老汉色老汉首页av亚洲| 国产69精品久久久久久| re久久精品视频| 91视频国产一区| 日韩久久精品网| 99久re热视频这里只有精品6| 97精品国产综合久久久动漫日韩 | 午夜在线视频| 欧美日韩视频专区在线播放| 国产中文在线观看| 69成人精品免费视频| 手机在线观看av| 欧美黄色片在线观看| 青青草91久久久久久久久| 99三级在线| 九九久久精品视频| 国产一级做a爰片久久| 欧美日韩国产精品一区| 特级毛片在线| 欧美成人免费大片| 91精品天堂福利在线观看| 日韩精品一区二区三区丰满| 成人h精品动漫一区二区三区| 欧美lavv| 99re热这里只有精品免费视频| 欧美系列一区| 成人免费毛片a| av网站免费在线| 在线播放国产精品二区一二区四区| 国产二区三区四区| 在线亚洲精品福利网址导航| 一二三四视频在线中文| 欧美日韩国产第一页| 亚洲一区二区| 久久久成人精品一区二区三区 | 熟妇人妻va精品中文字幕| **性色生活片久久毛片| 在线国产91| 不卡中文字幕av| 影视一区二区| 青草视频在线观看视频| 国产精品视频一二三区 | 日韩一区二区电影| 免费福利视频一区二区三区| 国产成人精品av在线| 免费看黄色91| 国产精美视频| 亚洲国产日韩欧美在线动漫| 亚洲精品亚洲人成在线观看| 久久亚洲午夜电影| 亚洲婷婷在线视频| 久九九久频精品短视频| 亚洲aa在线观看| 久久影视一区二区| а天堂中文在线官网| 久久久免费精品| 日韩精品久久理论片| 米奇777在线影院线| 尤物九九久久国产精品的特点| 日韩欧美另类一区二区| 成人国产精品一区| 久久人人爽爽爽人久久久| 国产日产一区二区| 国产欧美 在线欧美| 国产丝袜欧美中文另类| 91精品久久久| 91香蕉电影院| 亚洲天堂网中文字| 成人精品电影在线| 欧美日韩一区二区三区在线观看免| 欧美aaaaaa午夜精品| 四虎黄色影院| 中文字幕日韩在线播放| 久久久成人网| 亚洲综合色视频在线观看| 欧美日韩国产123| 国产乱人伦偷精品视频不卡| 国产黄大片在线观看画质优化| 亚洲欧洲激情在线| 国产欧美激情| 国产日产精品久久久久久婷婷| 欧美日本高清视频在线观看| jazzjazz国产精品麻豆| 伊人再见免费在线观看高清版| 91蝌蚪porny| 51漫画成人app入口| 成人性色av| 午夜欧美视频在线观看 | 日本在线观看网站| 日韩免费观看视频| www久久久久| av亚洲一区| 国产内射老熟女aaaa| 欧美大片国产精品| 国产欧美亚洲一区| 在线视频自拍| 成人精品视频在线| 亚洲综合色区另类av| 五月国产精品| 黄色永久免费网站| 欧美激情网友自拍| 国产精品私人影院| 日韩极品在线| 7878视频在线观看| 51久久精品夜色国产麻豆| 中文字幕巨乱亚洲| 99久久免费精品国产72精品九九| 福利视频一区二区三区| 激情成人中文字幕| 欧美激情综合色综合啪啪| 日本国产在线| 国产精品播放| 在线不卡免费av| 日韩av高清在线观看| 在线电影福利片| 在线看无码的免费网站| 亚洲女同性videos| 久久综合五月天婷婷伊人| www.亚洲一二| 全部a∨一极品视觉盛宴| 91九色精品视频| 欧美三级电影在线观看| 久久午夜精品一区二区| 欧美极品少妇videossex| av不卡在线免费观看| 最近中文字幕日韩精品| 91麻豆高清视频| av中文一区| 色网站在线看| 中国黄色录像片| 欧美极品少妇xxxxⅹ裸体艺术| 日韩黄色片在线观看| 白浆在线视频| 日本www.色| 91日本在线观看| 精品久久人人做人人爽| 高清日韩电视剧大全免费| 成人在线tv视频| 日本一本草久在线中文| 亚洲高清123| 久久久久久国产| 亚洲v中文字幕| 日本在线播放一区二区三区| 黑人巨大精品| 理论片鲁丝二区爱情网| 国产一区二区三区免费不卡| 亚洲免费av网址| 一区二区三区精品|