Shell腳本編程——1. Shell簡介

1. Shell簡介
shell是提供交互式計算機(jī)編程環(huán)境的UNIX程序,在終端窗口中使用 shell 與 UNIX 風(fēng)格的操作系統(tǒng)(例如 Linux 或 MacOS)進(jìn)行交互。
shell 位于用戶和操作系統(tǒng)之間,提供一些有用的命令和功能。簡單來看,shell是一個程序,用于為用戶運行指定命令并向用戶顯示運行結(jié)果。
1.1 特性
1.1.1 命令嵌套
把已有命令進(jìn)行適當(dāng)組合構(gòu)成新的命令。
1.1.2 文件名擴(kuò)展
提供了文件名擴(kuò)展字符(通配符,如* 、 ?、 [ ]),使得用單一的字符串可以匹配多個文件名,省去鍵入一長串文件名的麻煩。
1.1.3 直接使用Shell內(nèi)置命令
可以直接使用Shell的內(nèi)置命令,而不需創(chuàng)建新的進(jìn)程,如Shell中提供的cd、echo、exit、pwd、kill等命令。為防止因某些Shell不支持這類命令而出現(xiàn)麻煩,許多命令都提供了對應(yīng)的二進(jìn)制代碼,從而也可以在新進(jìn)程中運行。
通常來說,內(nèi)建命令會比外部命令執(zhí)行得更快,執(zhí)行外部命令時不但會觸發(fā)磁盤 I/O,還需要 fork 出一個單獨的進(jìn)程來執(zhí)行,執(zhí)行完成后再退出。而執(zhí)行內(nèi)建命令相當(dāng)于調(diào)用當(dāng)前 Shell 進(jìn)程的一個函數(shù)。
1.1.4 靈活地使用數(shù)據(jù)流
Shell允許靈活地使用數(shù)據(jù)流,提供通配符、輸入/輸出重定向、管道線等機(jī)制,方便了模式匹配、I/O處理和數(shù)據(jù)傳輸。
1.1.5 結(jié)構(gòu)化
結(jié)構(gòu)化的程序模塊,提供了順序流程控制、條件控制、循環(huán)控制等。
1.1.6 可后臺執(zhí)行
Shell提供了在后臺執(zhí)行命令的能力。
1.1.7 環(huán)境可配置
Shell提供了可配置的環(huán)境,允許創(chuàng)建和修改命令、命令提示符和其它的系統(tǒng)行為。
1.1.8 可創(chuàng)建復(fù)雜程序(Shell腳本)
Shell提供了一個高級的命令語言,能夠創(chuàng)建從簡單到復(fù)雜的程序。這些Shell程序稱為Shell腳本,利用Shell腳本,可把用戶編寫的可執(zhí)行程序與Unix命令結(jié)合在一起,當(dāng)作新的命令使用,從而便于用戶開發(fā)新的命令。
1.2 Shell種類
sh:Bourne Shell,UNIX 上的標(biāo)準(zhǔn)shell,很多UNIX版本都配有sh
bash:Bourne Again Shell,Linux的默認(rèn)shell,bash兼容sh,但并不完全一致
csh:C Shell,語法與C語言相似
ksh:Korn Shell,基于Bourne shell的源代碼發(fā)展而來
...
查看當(dāng)前系統(tǒng)所有可用的Shell
查看當(dāng)前正在使用的Shell
查看系統(tǒng)默認(rèn)的Shell
sh 一般被 bash 代替,/bin/sh
往往是指向/bin/bash
的符號鏈接
1.3 命令執(zhí)行方式
交互式(Interactive):解釋執(zhí)行用戶的命令,用戶輸入一條命令,Shell就解釋執(zhí)行一條
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執(zhí)行完,而不必一條一條地敲命令。
1.4 使用場景
1.4.1 建議使用的場景
使用只基于 UNIX 風(fēng)格的操作系統(tǒng)(如Linux)開發(fā)的程序(如bwa、gatk),或需要在服務(wù)器上運行軟件
文件操作可以使用簡單的命令完成
批量操作文件/文件夾
主要調(diào)用其他應(yīng)用程序并且數(shù)據(jù)操作較少
多條命令需要被重復(fù)執(zhí)行時(Shell腳本)
1.4.2 不建議使用的場景
資源密集型的任務(wù),尤其在需要考慮效率時(如排序,hash等)
需要處理大量數(shù)學(xué)操作,尤其是浮點運算,精確運算,或者復(fù)雜的算術(shù)運算(C/C++)
有跨平臺(操作系統(tǒng))移植需求(一般使用C或Java)
復(fù)雜的應(yīng)用,在必須使用結(jié)構(gòu)化編程的時候(需要變量的類型檢查,函數(shù)原型等)
需要復(fù)雜數(shù)據(jù)結(jié)構(gòu)的支持,比如類、鏈表或多維數(shù)組等數(shù)據(jù)結(jié)構(gòu)(R、Python)。
需要產(chǎn)生或操作圖形化界面 GUI。
私人的、閉源的程序