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 退出狀態碼越界