close
1.  Shell是用戶與系統內核之間的接口。內核在系統引導時加載入內存,當用戶登陸後,系統啟動shell,將shell加載入內存,然後等待用戶輸入命令。Shell解釋並執行命令,實現用戶與內核的交互。
2.  編寫命令可以在命令提示符後直接輸入,也可以將命令放入一個文件內,這叫做shell腳本。Shell腳本可以包含判斷,循環等編程結構。
3.  UNIX shell分為3類:Bourne shell、Korn shell、C shell。
4.  Linux 使用的是Bash shell,它是一個擴展的Bourne shell。
5.  Shell是一個進程,系統啟動shell時會分配給shell一個PID,當輸入一個命令時,shell會啟動一個子進程,來解釋這條命令,如果命令是一個內置命令,則直接調用內核來執行它,如果是一個可執行程序,那麽再啟動一個子進程,找到這個可執行程序,加載進內存,父進程處於休眠狀態。等可執行程序執行完畢了,再喚醒父進程。
6.  重定向-重定向是將輸入或輸出重定向到文件,而標準是輸入和輸出終端。符號是< 和 >,兩個連起來是追加<< 和 >>。
7.  管道- 管道是將一個命令的輸出作為另一個命令的輸入。符號是 | 。
8.  創建Bash shell腳本
1. 以 #!/bin/bash 作為行的開始
2. 註釋以 # 開始,直到行末
3. Shell腳本文件的權限必須可執行。Chmod +x filename
4.  定義一個變量通過直接賦值或者declare關鍵字
Name = “jone”
Declare name = “jone”
5.        定義一個全局變量
Export name=”jone”
6.        輸出變量
Echo $name
7.        讀取用戶輸入
Read name       #將用戶的輸入的一行賦給變量name
Read first last   #將用戶的輸入的一行,第一個單詞賦給變量first,剩下的賦給變量last
Read               #將用戶輸入的一行賦給內置變量REPLY
Read –a arrname     #將用戶輸入的一行賦給一個數組變量
Read –r line     #允許用戶輸入反斜杠
8.  算術運算
decalre –i num        #定義一個整型變量
num = 5                 #為一個變量賦值
num = 5+5             #執行加法運算
num = 5 + 5           #錯誤,加法運算符兩邊有空白字符
num = “5 + 5”              #正確,如果有空白字符,可以放在雙引號中
num = 4*6              #執行乘法運算
num = 6.5                     #錯誤,整型變量不能賦浮點值
num = 017              #八進制數據
num = 2#101          #二進制數據
num = 16#b            #十六進制數據
9.  Let 命令
Let i = 5                 #定義一個整型變量
Let i=i+5               #執行加法運算
Let i+=5                #令一種寫法
((i+=4))                 #let 的另一種寫法
10.              位置參量
可以在調用shell文件的時候,向shell腳本傳入參數。在shell腳本裏可以調用這些參數變量。
$0           shell文件名
$1           第一個參數
$9           第九個參數
${10}     第十個參數
$#           參數個數
$*           所有參數
$@         與$*相同
“$*”        單個變量,所有參數整合成一個字符串
“$@”      多個單獨變量
SET 可以重置位置參數,位置參數一旦被重置,原來的參數列表就丟失了。
11.              條件結構和流程控制
1)        退出狀態
每一個命令執行完畢後,shell都會返回一個退出狀態,表示這條命令是否執行成功,執行成功返回0,執行失敗返回1~255,$? 可以返回退出狀態的值。例如:
name = ‘tom’
grep “$name” /etc/password         #如果在password文件中找到tom,返回0
echo $?                                      #返回0,因為password文件中有tom的用戶
2)        內置命令test和let
Test命令可以對表達式和文件進行測試,如果測試為真,則返回退出狀態0,如果測試為假,則返回退出狀態1。如:
name = “tom”                     #給變量name賦值
Test $name == “tom”    #測試變量name是否等於”tom”,返回退出狀態0
Test $name != “tom”     #測試變量name是否不等於”tom”,返回退出狀態1

Test命令還可以采用另外一種寫法單方括號[],單方括號寫法中的shell元字符不會被解釋,元字符像*,?等。上面的例子也可以寫成:
name = “tom”                     #給變量name賦值
[ $name == “tom” ]      #測試變量name是否等於”tom”,返回退出狀態0
[ $name != “tom” ]      #測試變量name是否不等於”tom”,返回退出狀態1
[ $name == [Tt]?? ]     #由於元字符不會被解釋,所以?就是?,返回退出狀態1
X=5                             #給變量x賦值
Y=20                           #給變量y賦值
[ $x –le $y ]                 # -le 是test命令操作符,意思是小於等於,返回0

Test命令操作符還有以下:
[string1 == string2]              string1等於string2
[string != string]           string1不等於string2
[ string ]                       string不為空
[ -z string ]                   string的長度為0
[ -n string ]                   string的長度不為0
[string1 –a string2]        string1和string2都為真
[string1 –o string2]        string1和string2有一個為真
[int1 –eq int2]               int1和int2相等
[int1 –ne int2]               int1和int2不想等
[int1 –gt int2]               int1大於int2
[int1 –ge int2]               int1大於等於int2
[int1 –lt int2]                int1小於int2
[int1 –le int2]               int1小於等於int2
[file1 –nt file2]             file1比file2要新
[file1 –ot file2]             file1比file2要舊
[file1 –ef file2]             file1與file2有相同的i節點數

復合test命令
復合test命令是用雙方括號表示,可以解析shell元字符,如*,?等,復合test命令還可以用&&,||來代替-a,-o命令操作符。如:
name = “tom”                     #給變量name賦值
[ $name == “tom” ]      #測試變量name是否等於”tom”,返回退出狀態0
[ $name != “tom” ]      #測試變量name是否不等於”tom”,返回退出狀態1
[ $name == [Tt]?? ]     #由於元字符不會被解釋,所以?就是?,返回退出狀態1
[[ $name == [Tt]?? ]]  #由於元字符被解釋,所以?就是任意一個字符,返回退出狀態0
friend=”josegh”            #給變量friend賦值
[[ $name == [Tt]?? && friend == “jose” ]] #復合表達式,返回退出狀態1

Let命令測試數字運算
Let命令含有豐富的類C操作符,lei命令也可以用雙圓括號來表示。
X=2
Y=3
((x < 5))
((y >=4))
((x==2&&y==3))
((x+=4))
((x&y))
3)        if命令
if命令的格式:
if 命令
then 命令
fi
if後面的命令的退出狀態如果是0,那麽執行then後面的命令,如果非0,怎跳過then後面的命令,直接執行fi後面的命令。
if後面的命令可以是一條linux指令,也可以是一個test測試表達式,也可以是一個復合test表達式,也可以是一個let表達式。
例:
If grep “$name” /etc/password
Then
Echo “found”
Fi
If [ $answer == “Y” –o $answer == “y” ]
Then
Echo “yes”
Fi
If [[ $answer == [Yy]* || $answer == “Maybe” ]]
Then
Echo “got”
Fi
If (( $# <= 2 ))
Then
Echo “parameter error”
Fi

If/elif/else格式
If 命令
Then 命令組
Elif 命令
Then 命令組
Else 命令組
Fi

Case命令
Case命令是一個分支測試命令,case變量的值與v1,v2,v3…逐一比對,如果相等,就執行該值後面的命令,直到遇到雙分號,然後執行esac後面的命令。如果沒找到匹配的值,就執行 *) 後面的命令。Case表達式裏可以包含shell元字符,也可以用豎杠 | 將兩個值相或。Case命令格式:
Case 變量 in
值1)
命令組
;;
值2)
命令組
;;
值*)
命令組
;;
esac
4)        for循環命令
for循環格式:
for 變量 in 詞表
do
命令
Done
5)        while循環命令
while命令對緊跟在它後面的命令進行測試,如果退出狀態為0,那麽執行do和done之間的命令,然後再跳到while命令後面的命令進行測試,如此往復,直到while後面的命令退出狀態為非0。
while命令格式:
while 命令
do
命令
done
6)        select循環命令
select命令用於生成菜單選項。格式:
select var in wordlist
do
命令
done
7)        循環重定向和管道
while 命令
do
命令
done > file

while 命令
do
命令
done | 命令
12.              Grep
a)         grep即全局查找正則表達式並打印出結果行,grep通過正則表達式匹配,將匹配的結果的行打印出來,所以正則表達式是基礎。
b)        grep元字符
i.              字符串匹配字符串本身
grep tom /etc/password
ii.              字符串中有空格時,須放在引號中
grep “tom jack” /etc/password
iii.              ^匹配行開始
grep ‘^hello’ filename
iv.              $匹配行結尾
grep ‘ss$’ filename
v.              . 匹配任意一個字符
grep ‘l..e’ filename
vi.              *匹配0或多個字符
grep ‘s*’ filename
grep tom d*           #在所有以d開頭的文件中查找
vii.              [] 匹配一組字符中的任意一個
viii.              [^] 匹配不再這一組字符中的字符
ix.              \< 匹配詞首,可以在行中
x.              \> 匹配詞尾,可以在行中
xi.              \(..\) 匹配一個分組,可以回溯引用
grep ‘^s\([Hh]ello\).*\1’ filename        #\1匹配前面的分組
xii.              \{m\} \{m,\} \{m,n\} 匹配重復字符
c)         grep 選項
i.              –b    在每一行前面加上其所在的塊號
ii.              –c  顯示匹配到的行的數目,而不顯示行的內容
iii.              –h    不顯示文件名
iv.              –i    忽略大小寫
v.              –l    只列出匹配行所在的文件名
vi.              –n    在每一行前面加上所在文件的行號
vii.              –s    無聲操作,只顯示報錯信息
viii.              –v    反向查找

arrow
arrow
    創作者介紹
    創作者 多層分類 的頭像
    多層分類

    多層分類的部落格

    多層分類 發表在 痞客邦 留言(0) 人氣()