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