shell腳本基礎知識

shell腳本:

腳本語言3類特定

1、不需要編譯,有解釋器解釋執行;

2、弱類型;變量類型

3、變量通常不需要事先聲明


當shell腳本以非交互的方式運行時,它會先查找環境變量ENV,該變量制定了一個環節文件(通常是.bashrc),然後從該環境變量文件開始執行,當讀取了ENV文件後,shell纔開始執行shell腳本中的內容。shell腳本的執行通常可以採用以下三種方式:

1、bash script-name或sh script-name

2、path/scriptname或/script-name(當前路徑下執行腳本)

3、source script-name或.script-name #->注意"."點號


shell變量基礎及深入

變量可以分爲兩類:環境變量(全局變量)和局部變量

環境變量也可稱爲全局變量,可以在創建它們的shell及其派生出來的任意子進程shell中使用。局部變量只能在創建他們的shell函數或腳本中使用,還有一些變量用戶創建的,其他的則是專用shell變量。


環境變量

環境變量用於定義shell運行的環境,保證shell命令的正確執行,shell通過環境變量來確定登陸用戶名、命令路徑、終端類型、登錄目錄等,所有的環境變量都是系統全局變量,可用於所有子進程中,這包括編輯器、shell腳本和各類應用。

環境變量可以在命令行中設置,但用戶推出是這些變量值也會丟失,因此最好在用戶家目錄下的.bashfile文件中或全局配置/etc/profile文件或者/etc/bashrc,/etc/profile.d/中定義。將環境變量放入profile文件中,每次用戶登錄時這些變量值將被初始化。

傳統上,所有的環境變量均爲大寫。環境變量時已經用export內置命令導出的變量。有一些環境變量,比如HOME、PATH、SHELL、UID、USER等,在用戶登錄之前就已經被/bin/login程序設置好了。通常環境變量定義並保存在用戶家目錄下的.bash_profile文件中。


設置環境變量

如果想設置環境變量,就要在給變量值賦值之後或設置時使用export命令。帶-x選項的的declare內置命令也可以完成同樣的功能。(注意:輸出變量是不要在變量名面前加$)。


export命令和選項

格式:

1、exprot 變量名=value

2、變量名=value;exprot 變量名

3、declare -x 變量名=value

[root@TP-CW-WS-PH-01 /]# export NAME=bjia
[root@TP-CW-WS-PH-01 /]# declare -x NAME=bjia
[root@TP-CW-WS-PH-01 /]# NAME=bjia;export NAME


局部變量

本地變量在用戶當前的shell生存期的腳本中使用。例如,本地變量BJIA取值爲123,這個值只在用戶當前shell生存期中有意義。如果在shell中啓動另一個進程或退出本地變量BJIA值將無效

變量名=value

變量名='value'

變量名="value"

shell中的變量名的要求:一般是字母,數字,下劃線組成。

實例

1.
[root@localhost ~]# a=centos
[root@localhost ~]# b='centos'
[root@localhost ~]# c="centos"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
顯示
a=centos
b=centos
c=centos
2.
a=centos-$a
b='centos-$a'
c=“centos-$a"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
顯示
a=centos-centos
b=centos-$a
c=centos-centos-centos

b單引號直接引用引號中的內容,不做特殊處理

提示:

第一種定義a變量的方式是直接定義變量內容,內容一般爲簡單連續的數字、字符串、路徑名等。

第二種定義b變量的方式是通過單引號定義變量。這個方式的特點是:輸出變量是引號裏有什麼就輸出 什麼內容中有變量也會把變量名原樣輸出,適合於字符串中附帶有變量的內容定義。

第三種方式定義c變量方式是通過雙引號定義變量。這個方式的特點是:輸出變量時引號裏得變量會經過解析後輸出該變量內容,而不是把引號中變量名原樣輸出,適合於字符串中附帶有變量的內容的定義。習慣:數字不加引號,其他默認加雙引號。


定義變量單引號、雙引號與不加引號

有關單引號、雙引號與不加引號的簡要說明如下:

單引號:

可以說是所見即所得:即將單引號內的內容原樣輸出,或者描述爲單引號裏面看到的是什麼就會輸出什麼。

雙引號:

把內容輸出出來,會將含有空格的字符串視爲一個整體輸出,如果內容中有命令、變量等,會先把變量、命令解析出結果,然後在輸出最終內容來,如果字符串中帶有空格等

特殊字符:則不能完整的輸出,需要改加雙引號,一般連續的字符串,數字,路徑等可以不加任何引號,不過最好用雙引號替代之。


變量的命名規範

1、變量命名要統一,實用全部大寫字母,如APACHE ERR NUM:語義要清晰,能夠正確表達變量內容的含義,過長的英文單詞可採用幾個字符代替。多個單詞連接使用"_"號連接,引用時,最好以${APACHE_ERR_NUM}加大括號外加雙引號方式引用變量:

2、避免無含義字符或數字:例如下面的COUNT,並不知道其確切含義:

範例COUNT的不確切定義

COUNT='grep keywords file'

3、全局變量和局部變量命名

a.腳本中的全局變量定義,如CENTOS_HOME或CENTOSHOME,在變量使用時,使用{}將變量括起或"${CENOTOS_HOME}"

b.腳本中局部變量定義:存在於腳本函數{function}中的變量稱爲局部變量,要以local方式進行聲明,使之旨在本函數作用域內有效,防止變量在函數中的命名與變量外部程序中變量重名造成程序異常。

4、變量合併:當某些變量或配置項要組合起來纔有意義時,如文件路徑和文件名稱,建議將要組合的變量合併到一起賦值給一個新的變量,這樣既方便之後的調用,也爲以後進行修改提供了方便。

總結:多學習模仿操作系統自帶的/etc/init.d/functions函數庫腳本的定義思路。


shell特殊變量

1、位置變量:

$0獲取當前執行的shell腳本的文件名,包括路徑。

$n獲取當前執行shell腳本的第n個參數值,n=1..9.當n爲0時表示腳本的文件名,如果n大於9,用大括號括起來${10}

$*獲取當前shell的所有參數,將所有的命令行參數規爲單個字符串,相當於"$1""$2"$3"..."

注意與$#的區別

$#獲取當前shell命令行中參數的總個數

$@這個程序的所有參數"$1""#2""$3""...",這是將參數傳遞給其他程序的最佳方式,因爲他會保留所有內嵌在每個參數裏的任何空白。


腳本文件中,所有以#開頭的行均爲註釋行,不會被執行

檢查腳本的語法錯誤,不執行腳本:

bash -n /path/to/script_file.sh

調試執行腳本:

bash -x /path/to/script_file.sh


進程狀態變量

$$獲取當前shell的進程號(PID)

$!執行上一個指令的PID

$?獲取執行上一個指令的返回值(0爲成功,非0爲失敗)#這個變量很常用

$_在此之前執行的命令或腳本的最後一個參數

Linux退出狀態碼


狀態碼 描述


0 命令成功結束

1 通用未知錯誤

126 誤用shell命令

127 命令不可執行

128 沒找到命令

128+x Linux信號x的嚴重錯誤

130 命令通過Ctrl+C終止

255 退出狀態碼越界



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章