Linux shell環境的使用及腳本編程

介紹

Shell自己是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋樑,用戶的大部分工做都是經過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。做爲命令語言,它交互式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高級語言中才具備的控制結構,包括循環和分支。php

它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程序、創建文件並以並行的方式協調各個程序的運行。所以,對於用戶來講,shell是最重要的實用程序,深刻了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。linux

能夠說,shell使用的熟練程度反映了用戶對Unix/Linux使用的熟練程度。shell

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

交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。
Shell腳本和編程語言很類似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不須要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,至關於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。vim

Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱做一種Shell。咱們常說有多少種Shell,其實說的是Shell腳本解釋器。因爲bash是最多見的腳本解釋器,如無特殊說明,本課程中使用的shell默認都是bash shell。數組

注意:bash是linux標準的默認shell,bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行。安全

何時使用shell

由於Shell彷佛是各UNIX系統之間通用的功能,而且通過了POSIX的標準化。所以,Shell腳本只要「用心寫」一次,便可應用到不少系統上。所以,之因此要使用Shell腳本是基於:bash

  • 簡單性:Shell是一個高級語言;經過它,你能夠簡潔地表達複雜的操做。數據結構

  • 可移植性:使用POSIX所定義的功能,能夠作到腳本無須修改就可在不一樣的系統上執行。socket

  • 開發容易:能夠在短期內完成一個功能強大又實用的腳本。

可是,考慮到Shell腳本的命令限制和效率問題,下列狀況通常不使用Shell:

  1. 資源密集型的任務,尤爲在須要考慮效率時(好比,排序,hash等等)。

  2. 須要處理大任務的數學操做,尤爲是浮點運算,精確運算,或者複雜的算術運算(這種狀況通常使用C++或FORTRAN 來處理)。

  3. 有跨平臺(操做系統)移植需求(通常使用C 或Java)。

  4. 複雜的應用,在必須使用結構化編程的時候(須要變量的類型檢查,函數原型,等等)。

  5. 對於影響系統全局性的關鍵任務應用。

  6. 對於安全有很高要求的任務,好比你須要一個健壯的系統來防止入侵、破解、惡意破壞等等。

  7. 項目由連串的依賴的各個部分組成。

  8. 須要大規模的文件操做。

  9. 須要多維數組的支持。 須要數據結構的支持,好比鏈表或數等數據結構。

  10. 須要產生或操做圖形化界面 GUI。

  11. 須要直接操做系統硬件。

  12. 須要 I/O 或socket 接口。

  13. 須要使用庫或者遺留下來的老代碼的接口。

  14. 私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。

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

第一個shell腳本

打開文本編輯器vim,新建一個文件test,擴展名爲sh(sh表明shell),全名是 test.sh 。擴展名並不影響腳本執行,見名知意就好,若是你用 php 寫shell 腳本,擴展名就用 php 好了。

輸入一些代碼:

#!/bin/sh
#echo "123456"
echo "Hello World !"

第一行「#!」 是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行,即便用哪種Shell。一般/bin/sh是指向/bin/bash的。

但後面的字符 # 表示註釋,#後面的內容將被忽略。

echo命令用於向窗口輸出文本。

運行Shell腳本有兩種方法。

做爲可執行程序
將上面的代碼保存爲test.sh,並 cd 到相應目錄:

$ chmod +x ./test.sh  #使腳本具備執行權限
$ ./test.sh  #執行腳本
Hello World !

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

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

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

$ /bin/sh test.sh
$ /bin/php test.php

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

再看一個例子。下面的腳本使用 read 命令從 stdin 獲取輸入並賦值給 PERSON 變量,最後在 stdout 上輸出:

#!/bin/bash
# Author : mozhiyan
# Copyright (c) http://see.xidian.edu.cn/cpp/linux/
# Script follows here:
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

運行腳本:

$ chmod +x ./test.sh
$ ./test.sh
What is your name?
mozhiyan
Hello, mozhiyan

定義變量

Shell支持自定義變量。

定義變量時,變量名不加美圓符號($),如:

variableName="value"

注意,變量名和等號之間不能有空格,這可能和你熟悉的全部編程語言都不同。同時,變量名的命名須遵循以下規則:

首個字符必須爲字母(a-z,A-Z)。
中間不能有空格,可使用下劃線(_)。
不能使用標點符號。
不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。
變量定義舉例:

$ myUrl="http://see.xidian.edu.cn/cpp/linux/"
$ myNum=100

使用變量

使用一個定義過的變量,只要在變量名前面加美圓符號($)便可,如:

$ your_name="mozhiyan"
$ echo $your_name
mozhiyan
$ echo ${your_name}
mozhiyan

變量名外面的花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界,好比下面這種狀況:

$ for skill in Ada Coffe Action Java \
do \
    echo "I am good at ${skill}Script" \
done

若是不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值爲空),代碼執行結果就不是咱們指望的樣子了。

注:推薦給全部變量加上花括號,這是個好的編程習慣。

從新定義變量

已定義的變量,能夠被從新定義,如:

$ myID="Im a bird"
$ echo ${myID}
$ myID="Im a monkey"
$ echo ${myID}

這樣寫是合法的,但注意,第二次賦值的時候不能寫 $myID="Im a monkey",使用變量的時候才加美圓符($)。

只讀變量

使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。

下面的例子嘗試更改只讀變量,結果報錯:

#!/bin/bash
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"

運行腳本,結果以下:

./test.sh: line 7: myUrl: readonly variable

刪除變量

使用 unset 命令能夠刪除變量。語法:

$ unset variable_name

變量被刪除後不能再次使用;unset 命令不能刪除只讀變量。

舉個例子:

#!/bin/sh
myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
unset myUrl
echo $myUrl

上面的腳本沒有任何輸出。

若是以爲不過癮能夠到這裏來看看,能夠邊學邊練習的參考資料...

相關文章
相關標籤/搜索