hell腳本基礎知識詳細介紹

Shell本身是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言。作為命令語言,它交互式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變量和參數,并提供了許多在高級語言中才具有的控制結構,包括循環和分支。

它雖然不是Linux系統核心的一部分,但它調用了系統核心的大部分功能來執行程序、建立文件并以并行的方式協調各個程序的運行。因此,對于用戶來說,shell是最重要的實用程序,深入了解和熟練掌握shell的特性極其使用方法,是用好Linux系統的關鍵。

可以說,shell使用的熟練程度反映了用戶對Linux使用的熟練程度。

Shell有兩種執行命令的方式:

?交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。
?批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。

Shell腳本和編程語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取并執行這些命令,相當于一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。

Shell初學者請注意,在平常應用中,建議您不要用 root 帳號運行 Shell 。作為普通用戶,不管您有意還是無意,都無法破壞系統;但如果是 root,那就不同了,只要敲幾個字母,就可能導致災難性后果。

幾種常見的Shell

上面提到過,Shell是一種腳本語言,那么,就必須有解釋器來執行這些腳本。

Linux上常見的Shell腳本解釋器有bash、sh、ash、csh、ksh,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell腳本解釋器。

bash

bash是Linux系統默認使用的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。

Linux使用它作為默認的shell是因為它有諸如以下的特色:
?可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入并修改命令。
?自動通過查找匹配的方式給出以某字符串開頭的命令。
?包含了自身的幫助功能,你只要在提示符下面鍵入help就可以得到相關的幫助。

sh

sh 由Steve Bourne開發,是Bourne Shell的縮寫,各種UNIX系統都配有sh。

ash

ash shell 是由Kenneth Almquist編寫的,Linux中占用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。

csh

csh 是Linux比較大的內核,它由以William Joy為代表的共計47位作者編成,共有52個內部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

ksh

ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優點是幾乎和商業發行版的ksh完全兼容,這樣就可以在不用花錢購買商業版本的情況下嘗試商業版本的性能了。

Shell與編譯型語言的差異

大體上,可以將程序設計語言可以分為兩類:編譯型語言和解釋型語言。

編譯型語言

很多傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言需要預先將我們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱作“編譯”。

運行程序時,直接讀取目標代碼(object code)。由于編譯后的目標代碼(object code)非常接近計算機底層,因此執行效率很高,這是編譯型語言的優點。

但是,由于編譯型語言多半運作于底層,所處理的是字節、整數、浮點數或是其他機器層級的對象,往往實現一個簡單的功能需要大量復雜的代碼。例如,在C++里,就很難進行“將一個目錄里所有的文件復制到另一個目錄中”之類的簡單操作。

解釋型語言

解釋型語言也被稱作“腳本語言”。執行這類程序時,解釋器(interpreter)需要讀取我們編寫的源代碼(source code),并將其轉換成目標代碼(object code),再由計算機運行。因為每次執行程序都多了編譯的過程,因此效率有所下降。

使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell。

什么時候使用Shell

因為Shell似乎是各UNIX系統之間通用的功能,并且經過了POSIX的標準化。因此,Shell腳本只要“用心寫”一次,即可應用到很多系統上。因此,之所以要使用Shell腳本是基于:

?簡單性:Shell是一個高級語言;通過它,你可以簡潔地表達復雜的操作。
?可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可在不同的系統上執行。
?開發容易:可以在短時間內完成一個功能強大又妤用的腳本。

但是,考慮到Shell腳本的命令限制和效率問題,下列情況一般不使用Shell:

1.資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)。
2.需要處理大任務的數學操作,尤其是浮點運算,精確運算,或者復雜的算術運算(這種情況一般使用C++或FORTRAN 來處理)。
3.有跨平臺(操作系統)移植需求(一般使用C 或Java)。
4.復雜的應用,在必須使用結構化編程的時候(需要變量的類型檢查,函數原型,等等)。
5.對于影響系統全局性的關鍵任務應用。
6.對于安全有很高要求的任務,比如你需要一個健壯的系統來防止入侵、破解、惡意破壞等等。
7.項目由連串的依賴的各個部分組成。
8.需要大規模的文件操作。
9.需要多維數組的支持。
10.需要數據結構的支持,比如鏈表或數等數據結構。
11.需要產生或操作圖形化界面 GUI。
12.需要直接操作系統硬件。
13.需要 I/O 或socket 接口。
14.需要使用庫或者遺留下來的老代碼的接口。
15.私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。

如果你的應用符合上邊的任意一條,那么就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言比如C/C++,或者是Java。即使如此,你會發現,使用shell來原型開發你的應用,在開發步驟中也是非常有用的。

第一個Shell腳本

打開文本編輯器,新建一個文件,擴展名為sh(sh代表shell),擴展名并不影響腳本執行,見名知意就好,如果你用php寫shell 腳本,擴展名就用php好了。

輸入一些代碼:

復制代碼代碼如下:
#!/bin/bash
echo “Hello World !”

“#!” 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種Shell。echo命令用于向窗口輸出文本。

運行Shell腳本有兩種方法。

作為可執行程序

將上面的代碼保存為test.sh,并cd到相應目錄:

復制代碼代碼如下:
chmod +x ./test.sh? #使腳本具有執行權限
./test.sh? #執行腳本

注意,一定要寫成./test.sh,而不是test.sh。運行其它二進制的程序也一樣,直接寫test.sh,linux系統會去PATH里尋找有沒有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的當前目錄通常不在PATH里,所以寫成test.sh是會找不到命令的,要用./test.sh告訴系統說,就在當前目錄找。

通過這種方式運行bash腳本,第一行一定要寫對,好讓系統查找到正確的解釋器。

這里的”系統”,其實就是shell這個應用程序(想象一下Windows Explorer),但我故意寫成系統,是方便理解,既然這個系統就是指shell,那么一個使用/bin/sh作為解釋器的腳本是不是可以省去第一行呢?是的。

作為解釋器參數

這種運行方式是,直接運行解釋器,其參數就是shell腳本的文件名,如:

復制代碼代碼如下:
/bin/sh test.sh
/bin/php test.php

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98469

(2)
單爆手單爆手
上一篇 2018-05-14 08:32
下一篇 2018-05-14 08:55

相關推薦

  • 馬哥教育第三周4.15

    vimvim +10 直接跳到第10行i 輸入信息I跳到行首A跳到行尾o當前下面重新開啟一行O當前上面重新開啟一行w f2 另存為w!強行覆蓋r 后面跟路徑 可以讀取別的文件加進來:!命令 可以直接出執行結果:r!+路徑 文件 直接寫入文檔中:s 搜索 :%s/xyz/&er/g ? 擴展模式::q 退出:q! 強制退出,丟棄做出的修改:wq 保存退…

    Linux筆記 2018-04-15
  • LVS負載調度器,

    ?集群概念 ?LVS介紹 ?LVS實現 ?ldirectord

    Linux筆記 2018-07-01
  • 初學Linux之標準I/O和管道

    標準輸入和輸出 程序是由指令+數據組成程序的數據流有三種: 輸入數據流:<–標準輸入(stdin),一般默認是鍵盤輸出數據流:–>標準輸出(stdout),一般默認到終端窗口錯誤輸出流:–>標準錯誤(stderr),一般默認到終端窗口 標準輸入:0標準輸出:1錯誤輸出:2 I/O重定向:改變默認位置 輸出…

    Linux筆記 2018-04-03
  • Linux系統報錯修復的方法 . 2

    /boot/vmlinuz-2.6.32-696.el6.x86_64.img文件丟失怎么辦
    內有centos6的啟動流程

    2018-05-12
  • Linux發行版之間的聯系和不同

    Linux發行版以及不同發行版本之間的聯系和不同 Linux來源 Unix—minix—Linux tovalds-(1991)—Linux—GNU (GPL) 今天的Linux=Linux內核+GNU應用 1991年后誕生的Linux(一部分著名的Linux發行版):RedHat 、Fedora 、suse 、紅旗 、debian 、Ubuntu? Lin…

    2018-06-27
  • 第五周博客作業

    1、簡述rpm與yum命令的常見選項,并舉例
    2、自建yum倉庫,分別為網絡源和本地源
    3、簡述at和crontab命令,制定 每周三凌晨三、五點10分執行某個腳本,輸出當前時間,時間格式為 2017-12-28 10:00:00
    4、簡述sed常用操作命令,并舉例

    2018-04-11
欧美性久久久久