新聞中心
前言
到最后一節(jié)來(lái)寫“開篇”,確實(shí)有點(diǎn)古怪。不過(guò),在第一篇(數(shù)值操作)的開頭實(shí)際上也算是一個(gè)小的開篇,那里提到整個(gè)系列的前提是需要有一定的 Shell 編程基礎(chǔ),因此,為了能夠讓沒(méi)有 Shell 編程基礎(chǔ)的讀者也可以閱讀這個(gè)系列,我到最后來(lái)重寫這個(gè)開篇。開篇主要介紹什么是 Shell,Shell 運(yùn)行環(huán)境,Shell 基本語(yǔ)法和調(diào)試技巧。

創(chuàng)新互聯(lián)是一家專業(yè)提供云浮企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為云浮眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
什么是 Shell
首先讓我們從下圖看看 Shell 在整個(gè)操作系統(tǒng)中所處的位置吧,該圖的外圓描述了整個(gè)操作系統(tǒng)(比如 Debian/Ubuntu/Slackware 等),內(nèi)圓描述了操作系統(tǒng)的核心(比如 Linux Kernel),而 Shell 和 GUI 一樣作為用戶和操作系統(tǒng)之間的接口。
GUI 提供了一種圖形化的用戶接口,使用起來(lái)非常簡(jiǎn)便易學(xué);而 Shell 則為用戶提供了一種命令行的接口,接收用戶的鍵盤輸入,并分析和執(zhí)行輸入字符串中的命令,然后給用戶返回執(zhí)行結(jié)果,使用起來(lái)可能會(huì)復(fù)雜一些,但是由于占用的資源少,而且在操作熟練以后可能會(huì)提高工作效率,而且具有批處理的功能,因此在某些應(yīng)用場(chǎng)合還非常流行。
Shell 作為一種用戶接口,它實(shí)際上是一個(gè)能夠解釋和分析用戶鍵盤輸入,執(zhí)行輸入中的命令,然后返回結(jié)果的一個(gè)解釋程序(Interpreter,例如在 linux 下比較常用的 Bash),我們可以通過(guò)下面的命令查看當(dāng)前的 Shell :
$ echo $Shell
/bin/bash
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 702160 2008-05-13 02:33 /bin/bash該解釋程序不僅能夠解釋簡(jiǎn)單的命令,而且可以解釋一個(gè)具有特定語(yǔ)法結(jié)構(gòu)的文件,這種文件被稱作腳本(Script)。它具體是如何解釋這些命令和腳本文件的,這里不深入分析,請(qǐng)看我在 2008 年寫的另外一篇文章:《Linux命令行上程序執(zhí)行的一剎那》。
既然該程序可以解釋具有一定語(yǔ)法結(jié)構(gòu)的文件,那么我們就可以遵循某一語(yǔ)法來(lái)編寫它,它有什么樣的語(yǔ)法,如何運(yùn)行,如何調(diào)試呢?下面我們以 Bash 為例來(lái)討論這幾個(gè)方面。
搭建運(yùn)行環(huán)境
為了方便后面的練習(xí),我們先搭建一個(gè)基本運(yùn)行環(huán)境:在一個(gè) Linux 操作系統(tǒng)中,有一個(gè)運(yùn)行有 Bash 的命令行在等待我們鍵入命令,這個(gè)命令行可以是圖形界面下的 Terminal (例如 Ubuntu 下非常厲害的 Terminator),也可以是字符界面的 Console (可以用 CTRL+ALT+F1~6 切換),如果你發(fā)現(xiàn)當(dāng)前 Shell 不是 Bash,請(qǐng)用下面的方法替換它:
$ chsh $USER -s /bin/bash
$ su $USER或者是簡(jiǎn)單地鍵入Bash:
$ bash
$ echo $Shell # 確認(rèn)一下
/bin/bash如果沒(méi)有安裝 Linux 操作系統(tǒng),也可以考慮使用一些公共社區(qū)提供的 Linux 虛擬實(shí)驗(yàn)服務(wù),一般都有提供遠(yuǎn)程 Shell,你可以通過(guò) Telnet 或者是 Ssh 的客戶端登錄上去進(jìn)行練習(xí)。
有了基本的運(yùn)行環(huán)境,那么如何來(lái)運(yùn)行用戶鍵入的命令或者是用戶編寫好的腳本文件呢 ?
假設(shè)我們編寫好了一個(gè) Shell 腳本,叫 test.sh 。
第一種方法是確保我們執(zhí)行的命令具有可執(zhí)行權(quán)限,然后直接鍵入該命令執(zhí)行它:
$ chmod +x /path/to/test.sh
$ /path/to/test.sh第二種方法是直接把腳本作為 Bash 解釋器的參數(shù)傳入:
$ bash /path/to/test.sh或
$ source /path/to/test.sh或
$ . /path/to/test.sh基本語(yǔ)法介紹
先來(lái)一個(gè) Hello, World 程序。
下面來(lái)介紹一個(gè) Shell 程序的基本結(jié)構(gòu),以 Hello, World 為例:
#!/bin/bash -v
# test.sh
echo "Hello, World"把上述代碼保存為 test.sh,然后通過(guò)上面兩種不同方式運(yùn)行,可以看到如下效果。
方法一:
$ chmod +x test.sh
$ ./test.sh
./test.sh
#!/bin/bash -v
echo "Hello, World"
Hello, World方法二:
$ bash test.sh
Hello, World
$ source test.sh
Hello, World
$ . test.sh
Hello, World我們發(fā)現(xiàn)兩者運(yùn)行結(jié)果有區(qū)別,為什么呢?這里我們需要關(guān)注一下 test.sh 文件的內(nèi)容,它僅僅有兩行,第二行打印了 Hello, World,兩種方法都達(dá)到了目的,但是第一種方法卻多打印了腳本文件本身的內(nèi)容,為什么呢?
原因在該文件的第一行,當(dāng)我們直接運(yùn)行該腳本文件時(shí),該行告訴操作系統(tǒng)使用用#! 符號(hào)之后面的解釋器以及相應(yīng)的參數(shù)來(lái)解釋該腳本文件,通過(guò)分析第一行,我們發(fā)現(xiàn)對(duì)應(yīng)的解釋器以及參數(shù)是 /bin/bash -v,而 -v 剛好就是要打印程序的源代碼;但是我們?cè)谟玫诙N方法時(shí)沒(méi)有給 Bash 傳遞任何額外的參數(shù),因此,它僅僅解釋了腳本文件本身。
其他語(yǔ)法細(xì)節(jié)請(qǐng)直接看《Shell編程學(xué)習(xí)筆記》即本書后面的附錄一。
Shell 程序設(shè)計(jì)過(guò)程
Shell 語(yǔ)言作為解釋型語(yǔ)言,它的程序設(shè)計(jì)過(guò)程跟編譯型語(yǔ)言有些區(qū)別,其基本過(guò)程如下:
- 設(shè)計(jì)算法
- 用 Shell 編寫腳本程序?qū)崿F(xiàn)算法
- 直接運(yùn)行腳本程序
可見它沒(méi)有編譯型語(yǔ)言的"麻煩的"編譯和鏈接過(guò)程,不過(guò)正是因?yàn)檫@樣,它出錯(cuò)時(shí)調(diào)試起來(lái)不是很方便,因?yàn)檎Z(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤都在運(yùn)行時(shí)出現(xiàn)。下面我們簡(jiǎn)單介紹一下調(diào)試方法。
調(diào)試方法介紹
可以直接參考資料:Shell 腳本調(diào)試技術(shù) 或者 BASH 的調(diào)試手段。
小結(jié)
Shell 語(yǔ)言作為一門解釋型語(yǔ)言,可以使用大量的現(xiàn)有工具,包括數(shù)值計(jì)算、符號(hào)處理、文件操作、網(wǎng)絡(luò)操作等,因此,編寫過(guò)程可能更加高效,但是因?yàn)樗墙忉屝偷模枰趫?zhí)行過(guò)程中從磁盤上不斷調(diào)用外部的程序并進(jìn)行進(jìn)程之間的切換,在運(yùn)行效率方面可能有劣勢(shì),所以我們應(yīng)該根據(jù)應(yīng)用場(chǎng)合選擇使用 Shell 或是用其他的語(yǔ)言來(lái)編程。
參考資料
- Linux命令行上程序執(zhí)行的一剎那
- Linux Shell編程學(xué)習(xí)筆記
- Shell 腳本調(diào)試技術(shù)
- BASH 的調(diào)試手段
本文標(biāo)題:創(chuàng)新互聯(lián)Shell教程:Shell 準(zhǔn)備工作
網(wǎng)頁(yè)URL:http://fisionsoft.com.cn/article/cceoedo.html


咨詢
建站咨詢
