1、shell腳本shell
用各種命令預先放入到一個文件中,方便一次性執行的一個程序文;將一些shell的語法與指令寫在裏面,而後用正規表示法,管道命令以及數據流重導向等功能,以達到咱們所想要的處理目的。Shell就是一個命令行解釋器,它的做用就是遵循必定的語法將輸入的命令加以解釋並傳給系統。它爲用戶提供了一個向Linux發送請求以便運行程序的接口系統級程序,用戶能夠用Shell來啓動、掛起、中止甚至是編寫一些程序。vim
2、shell執行腳本bash
一、touch "文件名".sh,,例如 touch test.sh ->vim test.sh ,編寫以下:ide
1 #!/bin/bash 2 echo "hello world" 3 cd ..; 4 ls
a.Shell腳本中用#表示註釋,但若是#位於第一行開頭,是則例外,它表示該腳本使用後面指定的解釋器/bin/sh解釋執行函數
b.執行的方式:spa
第一種執行方式: chmod +x test.sh命令行
第二種執行方式:/bin/bash test.shorm
3、shell執行過程
htm
一、交互Shell(bash)fork/exec一個子Shell(sh)用於執行腳本,父進程bash等待子進程sh終止blog
二、sh讀取腳本中的cd ..命令,調用相應的函數執行內建命令,改變當前工做目錄爲上一級目 錄。
三、sh讀取腳本中的ls命令,fork/exec這個程序,列出當前工做目錄下的文件,sh等待ls終止。
四、ls終止後,sh繼續執行,讀到腳本文件末尾,sh終止。
五、sh終止後,bash繼續執行,打印提示符等待用戶輸入
4、shell變量
按照慣例,Shell變量由全大寫字母加下劃線組成,有兩種類型的Shell變量:
一、環境變量
環境變量能夠從父進程傳給子進程,所以Shell進程的環境變量能夠從當前Shell進程傳給fork
出來的子進程。用printenv命令能夠顯示當前Shell進程的環境變量
二、本地變量
只存在於當前Shell進程,用set命令能夠顯示當前Shell進程中定義的全部變量(包括本地變 量
和環境變量)和函數。環境變量是任何進程都有的概念,而本地變量是Shell特有的概念。在Shell中,環境變量和本地變量的定義和用法類似。在Shell中定義或賦值一個變量:
VARNAME=value
注意等號兩邊都不能有空格,不然會被Shell解釋成命令和命令行參數。一個變量定義後僅
存在於當前Shell進程,它是本地變量,用export命令能夠把本地變量導出爲環境變量
5、變量引用
若是一個變量叫作VARNAME,用${VARNAME}能夠表示它的值,在不引發歧義的狀況下也能夠VARNAME表示它的值。經過如下例子比較這兩種表示法的不一樣:
echo $SHELL echo $SHELLabc echo ${SHELL} echo ${SHELL}abc
注意,在定義變量時不用$,取變量值時要用$。和C語言不一樣的是,Shell變量不須要明肯定義
類型,事實上Shell變量的值都是字符串,好比咱們定義VAR=45,其實VAR的值是字符串45而非整 數。Shell變量不須要先定義後使用,若是對一個沒有定義的變量取值,則值爲空字符串。
6、文件名代換
通配符 * : 匹配0個或多個任意字符
? : 匹配一個任意字符
[若干字符] : 匹配方括號中任意一個字符的一次出現
$ ls /dev/ttyS*
$ ls ch0?.doc
$ ls ch0[0-2].doc
$ ls ch[012][0-9].doc
注意,Globbing所匹配的文件名是由Shell展開的,也就是說在參數還沒傳給程序以前已經展開
了,好比上述ls ch0[012].doc命令,若是當前目錄下有ch00.doc和ch02.doc,則傳給ls命令的參數其實是這兩個文件名,而不是一個匹配字符串。
7、命令代換:`或 $()
一、由反引號括起來的也是一條命令,Shell先執行該命令,而後將輸出結果馬上代換到當前命令行中
DATE=`date` echo $DATE
例如定義一個變量存放date命令的輸出:命令代換也能夠用$()表示: $ DATE=$(date)
二、算術代換:$(())
用於算術計算,$(())中的Shell變量取值將轉換成整數,例如:
VAR=45 echo $(($VAR+3))
$(())中只能用+-*/和()運算符,而且只能作整數運算。
8、轉義字符\
一、好比建立一個文件名爲「$ $」(中間有空格)的文件能夠這樣:
$ touch \$\ \$
二、好比建立一個文件名爲「-」開始的文件能夠這樣:
touch ./-hello
9、單引號
和C語言不同,Shell腳本中的單引號和雙引號同樣都是字符串的界定符,而不是字符的界定符。單引號用於保持引號內全部字符的字面值,即便引號內的\和回車也不例外,可是字符串中不能出現單引號。若是引號沒有配對就輸入回車,Shell會給出續行提示符,要求用戶把引號配上對。例如:
10、雙引號
雙引號用於保持引號內全部字符的字面值(回車也不例外),但如下狀況除外:
$加變量名能夠取變量的值
反引號仍表示命令替換
\$ 表示$的字面值
\` 表示`的字面值
\" 表示"的字面值
\\ 表示\的字面值 除以上狀況以外,在其它字符前面的\無特殊含義,只表示字面值: