學(xué)習(xí)生物信息的過(guò)程中難免需要編寫(xiě)繁復(fù)的pipeline,而bash腳本對(duì)構(gòu)建pipeline幫助很大,它可以像膠水一樣將流程粘合起來(lái),而我們只需要掌握一些基本的命令(例如管道,重定向,后臺(tái)運(yùn)行等),加上一些輸入輸出的合法性判斷就可以了。
編寫(xiě)魯棒的頭部
bash腳本換照慣例使用".sh"后綴,創(chuàng)建腳本文件后,可以將以下的幾行內(nèi)容放置在腳本的開(kāi)頭部分:

解釋?zhuān)?/p>
此行叫做shebang,它的作用是告訴計(jì)算機(jī)該腳本的內(nèi)容調(diào)用哪個(gè)程序來(lái)執(zhí)行,這樣在執(zhí)行的時(shí)候可以直接像程序一樣調(diào)用,這一行技術(shù)上不是必要的,但是加上是一個(gè)好習(xí)慣。
腳本運(yùn)行出錯(cuò)的話,默認(rèn)不會(huì)中止程序而是繼續(xù)運(yùn)行下一行,這顯然不是我們想要的特性。通過(guò)設(shè)置這個(gè)參數(shù)可以確保程序出錯(cuò)(返回非0的狀態(tài)碼)會(huì)及時(shí)中止。值得注意的是,bash自己能夠判斷出“錯(cuò)誤“與”false“的區(qū)別,例如if語(yǔ)句返回的非0狀態(tài)碼并不會(huì)導(dǎo)致程序中斷。
-
默認(rèn)情況下,bash引用未命名的變量并不會(huì)報(bào)錯(cuò),可能導(dǎo)致嚴(yán)重后果。比如說(shuō):
rm -rf $NOSET/*,NOSET變量由于之前未聲明被解析為空,命令就變?yōu)?code>rm -rf /*(如下):$ echo "rm -rf $NOSET/*" rm -rf /* set -e參數(shù)確保程序返回非零狀態(tài)碼時(shí)腳本會(huì)異常退出,但是存在一個(gè)漏洞,那就是如果我們使用了管道命令,管道只返回最后一個(gè)程序的狀態(tài)碼,中間程序出錯(cuò)不會(huì)終止程序。這明顯也不是我們想要的,因此需要設(shè)置這個(gè)參數(shù)。
這3個(gè)參數(shù)可以放在一起使用,寫(xiě)作set -euo pipefail。
運(yùn)行bash文件
bash腳本存在兩種運(yùn)行方式,其一是直接調(diào)用bash 腳本;其二是在添加shebang的情況下,chmod +x 腳本給予運(yùn)行權(quán)限,再調(diào)用./腳本執(zhí)行。兩者技術(shù)上沒(méi)有任何區(qū)別,不過(guò)后者更加通用,適用于其它語(yǔ)言編寫(xiě)的腳本(更換shebang即可)。編寫(xiě)魯棒的bash腳本有很多需要學(xué)習(xí)的地方,之后章節(jié)會(huì)詳細(xì)介紹。