第一章:認識Shell腳本php
1.1、什麼是Shelllinux
Shell是系統的用戶界面,提供了用戶與內核進行交互操做的一種接口。它接收用戶輸入的命令並把它送入內核去執行。shell
實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令而且把它們送到內核。不只如此,Shell有本身的編程語言用於對命令的編輯,它容許用戶編寫由shell命令組成的程序。Shell編程語言具備普通編程語言的不少特色,好比它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其餘應用程序具備一樣的效果。編程
1.2、什麼是Shell腳本(Shell Script)vim
Shell腳本最經常使用於系統管理工做,Shell腳本與Windows/Dos下的批處理類似,也就是用各種命令預先放入到一個文件中,方便一次性執行的一個程序文件,主要是方便管理員進行設置或者管理用的。可是它比Windows下的批處理更強大,比用其餘編程程序編輯的程序效率更高,它使用了Linux/Unix下的命令。centos
1.3、腳本編程語言與編譯型語言的區別bash
許多中型、大型的程序都是用編譯型語言寫成,例如C、C++、JAVA等。這類程序只要從源代碼轉換成目標代碼(機器語言),便能直接經過計算機來執行。編譯型語言的好處就是運行速度快,缺點則是它們多半運做於底層,所處理的是字節、整數、浮點數或是其餘機器層級的對象。例如在C++裏,很難進行」將一個目錄裏全部的文件複製到另外一個目錄中」之類的簡單操做。編程語言
腳本編程語言一般是解釋型。這類程序的執行,不須要編譯,直接由解釋器讀入程序代碼,並將其轉換成內部的形式,再執行,因此運行速度相對編譯型語言要慢。請注意,解釋器自己是通常的編譯型程序。編輯器
1.4、爲何要使用Shell腳本性能
腳本編程語言(Shell腳本)多半運行在比編譯型語言還高的層級,可以輕易處理文件與目錄之類的對象。缺點則是腳本編程語言運行速度一般不如編譯型語言。不過權衡之下,一般在Linux系統管理方面使用腳本編程是很是高效的。花一個小時寫成的簡單腳本一樣的功能用C或C++來編寫實現,可能須要更多的時間。並且通常來講,腳本運行速度已經夠快了,快到足以讓人忽略它性能上的問題。
1.5、Shell腳本的類型(解釋器的種類)
Shell腳本的類型有不少,目前流行的Shell腳本包括ash、bash、ksh、csh、zsh等,用戶能夠經過查看/etc/shells 文件中的內容來查看本身主機中當前有哪些種類的Shell腳本。
範例:
[root@cloucentos6 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
1.6、一個簡單的shell腳本
打開文本編輯器(可使用vi/vim命令來建立文件),新建一個文件test.sh,擴展名爲sh(sh表明shell),擴展名並不影響腳本執行,見名知意就好,若是你用php寫shell 腳本,擴展名就用php好了。
[root@cloucentos6 home]# vim test.sh #使用vim文本編輯器編寫test.sh腳本
#!/bin/bash
echo "hello world!"
[root@cloucentos6 home]# chmod +x test.sh #賦予test.sh執行權限
[root@cloucentos6 home]# ./test.sh #執行test.sh腳本
hello world!
1.7、Shell腳本第一行#!意義
標註:若是腳本做爲sh的命令行參數運行,腳本第一行聲明#!/bin/bash就不起做用。
Shell腳本開頭第一行基本都以#!打頭,它不是註釋,"#!/bin/sh"是對shell的聲明,說明你所用sh解釋器及/bin/sh是sh的路徑;告訴操做系統, 此腳本的解釋器爲 /bin/sh 這個可執行文件, 若是你的腳本用 bash解釋, 第一行就應該是
#!/bin/bash
若是Shell腳本沒有這樣定義的第一行, 不一樣 unix 類操做系統會用默認 shell 來解釋腳本, 如 unix 每每是 sh, linux 每每是用 bash等等。本教程主要採用bash解釋器。
1.8、Shell 腳本兩種執行方式
打開終端通常都會出現一個提示符,其形式一般以下所示:
[root@cloucentos6 home]#
或
bash-4.1$
其中#表明系統超級用戶,$表明系統普通用戶。超級用戶是Linux系統中權限最高的用戶。
shell腳本運行方式一:將test.sh腳本做爲sh的命令行參數運行
[root@cloucentos6 home]# sh test.sh #假設test.sh腳本位於當前/home目錄下
[root@cloucentos6 home]# sh /home/test.sh #使用test.sh完整路徑
[root@cloucentos6 home]# /bin/sh test.sh
shell腳本運行方式二:將test.sh腳本賦予執行權限的可執行文件,即chmod +x test.sh
[root@cloucentos6 home]# ./test.sh #此命令 ./表當前目錄
[root@cloucentos6 home]# /home/test.sh #使用test.sh腳本的完整路徑
1.9、變量
變量從字面上就是能夠變化的量,每個變量的值都是字符串,不管變量賦值有沒有使用引號,值都會以字符串的形式存儲。腳本語言一般不須要在使用變量以前聲明其類型,只須要直接賦值便可。有一些特殊的變量會被shell環境和操做系統環境用來存儲一些特別的值,這類變量被稱爲環境變量。
變量的定義,只能以字母和下劃線開始,區分大小寫,能夠包含數字、字母或下劃線符號。
變量的賦值的方式爲:先寫變量名稱,緊接着=字符,最後就是新值,中間徹底沒有任何空格;當你想取出Shell變量的值時,需在變量名稱面前加上$字符;當變量所賦予的值內含空格時,須要加上雙引號;當幾個變量鏈接起來時,也須要使用雙引號。
標註:變量賦值var=value不能寫成var = value,前者是賦值操做,後面是相等操做。獲取var變量的值可使用echo $var 或 echo ${var}
範例1:
[root@localhost home]# vim test.sh #編寫一個test.sh腳本
#!/bin/sh
var1=hello
echo $var1
var2=man!
echo ${var2}
var3="hello boy!"
echo $var3
var4="$var1 $var2 $var3"
echo $var4
[root@localhost home]#./test.sh #執行test.sh腳本,運行後結果以下
hello
man!
hello boy!
hello man! hello boy!
獲取字符串長度,length=${#var}
範例2:
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
var=1234567890
echo ${#var}
[root@cloucentos6 home]# ./test.sh
10
1.10、簡單跟蹤shell腳本
範例1:使用選項 –x啓動跟蹤調試shell腳本
[root@localhost home]#sh -x ./test.sh #經過sh -x跟蹤test.sh腳本
+ sh -x ./test.sh
+ echo 'hello!man'
hello!man
+ printf 'hello!boy\n'
hello!boy
範例2:經過set -x 命令在test.sh腳本指定跟蹤到一小部分,而後在使用 set +x閉關跟蹤功能。
[root@localhost home]#vim test.sh #只跟蹤text.sh腳本里的echo hello!man這行命令
#!/bin/sh
set -x
echo hello!man
set +x
printf "hello!boy\n"
[root@localhost home]# ./test.sh
+ ./test.sh
+ echo 'hello!man'
hello!man
+ set +x
hello!boy
經過在腳本第一行聲明#!/bin/bash修改爲 #!/bin/bash –xv一樣也能啓用跟蹤調試功能。