一、什么是shell
????????Shell是命令解釋器(command interpreter),是Unix操作系統(tǒng)的用戶接口,程序從用戶接口得到輸入信息,shell將用戶程序及其輸入翻譯成操作系統(tǒng)內(nèi)核(kernel)能夠識(shí)別的指令,并且操作系統(tǒng)內(nèi)核執(zhí)行完將返回的輸出通過(guò)shell再呈現(xiàn)給用戶,下圖所示用戶、shell和操作系統(tǒng)的關(guān)系:

Shell也是一門(mén)編程語(yǔ)言,即shell腳本,shell是解釋執(zhí)行的腳本語(yǔ)言,可直接調(diào)用linux命令。 .java -> .class
一個(gè)系統(tǒng)可以存在多個(gè)shell,可以通過(guò)cat /etc/shells命令查看系統(tǒng)中安裝的shell,不同的shell可能支持的命令語(yǔ)法是不相同的。
二、shell的種類
????????操作系統(tǒng)內(nèi)核(kernel)與shell是獨(dú)立的套件,而且都可被替換。不同的操作系統(tǒng)使用不同的shell;同一個(gè)kernel之上可以使用不同的shell。
常見(jiàn)的shell分為兩大主流:
sh:
Bourne shell(sh) ,Solaris,hpux默認(rèn)shell
Bourne again shell(bash) ,Linux系統(tǒng)默認(rèn)shell
csh:
C shell(csh)
tc shell(tcsh)
查看shell:

三、shell環(huán)境定義
臨時(shí)環(huán)境變量
????????所謂臨時(shí)變量是指在用戶在當(dāng)前登陸環(huán)境生效的變量,用戶登陸系統(tǒng)后,直接在命令行上定義的環(huán)境變量便只能在當(dāng)前的登陸環(huán)境中使用。當(dāng)退出系統(tǒng)后,環(huán)境變量將不能下次登陸時(shí)繼續(xù)使用。
將環(huán)境變量永久生效
????????通過(guò)將環(huán)境變量定義寫(xiě)入到配置文件中,用戶每次登陸時(shí)系統(tǒng)自動(dòng)定義,則無(wú)需再到命令行重新定義。定義環(huán)境變量的常見(jiàn)配置文件如下:
/etc/profile: 針對(duì)系統(tǒng)所有用戶生效,此文件應(yīng)用于所有用戶每次登陸系統(tǒng)時(shí)的環(huán)境變量定義
$HOME_name/.bash_profile: 針對(duì)特定用戶生效,$HOME為用戶的宿主目錄,當(dāng)用戶登陸系統(tǒng)后,首先繼承/etc/profile文件中的定義,再應(yīng)用$HOME/.bash_profile文件中的定義。
系統(tǒng)預(yù)定義的環(huán)境變量
????????系統(tǒng)環(huán)境變量對(duì)所有用戶有效,如:PATH、HOME、SHELL、PWD等等,如下用echo命令打印上述的系統(tǒng)環(huán)境變量:

四、shell腳本編程
????????同傳統(tǒng)的編程語(yǔ)言一樣,shell提供了很多特性,這些特性可以使你的shell腳本編程更為有用。
創(chuàng)建Shell腳本
一個(gè)shell腳本通常包含如下部分:
首行
第一行內(nèi)容在腳本的首行左側(cè),表示腳本將要調(diào)用的shell解釋器,內(nèi)容如下:
#!/bin/bash
#!符號(hào)能夠被內(nèi)核識(shí)別成是一個(gè)腳本的開(kāi)始,這一行必須位于腳本的首行,/bin/bash是bash程序的絕對(duì)路徑,在這里表示后續(xù)的內(nèi)容將通過(guò)bash程序解釋執(zhí)行。
注釋
注釋符號(hào)# 放在需注釋內(nèi)容的前面
內(nèi)容
下面是一個(gè)可執(zhí)行的shell腳本的結(jié)構(gòu),如下:

Shell腳本的權(quán)限
????????一般情況下,默認(rèn)創(chuàng)建的腳本是沒(méi)有執(zhí)行權(quán)限的。

????????沒(méi)有權(quán)限不能執(zhí)行,需要賦予可執(zhí)行權(quán)限。

Shell腳本的執(zhí)行
????????1,輸入腳本的絕對(duì)路徑或相對(duì)路徑
/root/shell/test.sh
./test.sh

2,bash或sh +腳本
bash /root/shell/test2.sh
sh test2.sh
注:當(dāng)腳本沒(méi)有x權(quán)限時(shí),root和文件所有者通過(guò)該方式可以正常執(zhí)行。

3,在腳本的路徑前再加". " 或source
source /root/helloWorld.sh
. ./helloWorld.sh
區(qū)別:1、第一種和第二種會(huì)新開(kāi)一個(gè)bash,不同bash中的變量無(wú)法共享。
2、但是使用. ./腳本source 這種方式是在同一個(gè)shell里面執(zhí)行的。

五、shell變量
????????變量:是shell傳遞數(shù)據(jù)的一種方式,用來(lái)代表每個(gè)取值的符號(hào)名。當(dāng)shell腳本需要保存一些信息時(shí),如一個(gè)文件名或是一個(gè)數(shù)字,就把它存放在一個(gè)變量中。
????????變量設(shè)置規(guī)則:
1,變量名稱可以由字母,數(shù)字和下劃線組成,但是不能以數(shù)字開(kāi)頭,環(huán)境變量名建議大寫(xiě),便于區(qū)分。
2,在bash中,變量的默認(rèn)類型都是字符串型,如果要進(jìn)行數(shù)值運(yùn)算,則必須指定變量類型為數(shù)值型。
3,變量用等號(hào)連接值,等號(hào)左右兩側(cè)不能有空格。
4,變量的值如果有空格,需要使用單引號(hào)或者雙引號(hào)包括。
????????變量分類:
Linux Shell中的變量分為用戶自定義變量,環(huán)境變量,位置參數(shù)變量和預(yù)定義變量??梢酝ㄟ^(guò)set命令查看系統(tǒng)中存在的所有變量。
系統(tǒng)變量:保存和系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù)。HOME、PWD、SHELL、USER等等
位置參數(shù)變量:主要用來(lái)向腳本中傳遞參數(shù)或數(shù)據(jù),變量名不能自定義,變量作用固定。
預(yù)定義變量:是Bash中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的。
用戶自定義變量
????????用戶自定義的變量由字母或下劃線開(kāi)頭,由字母,數(shù)字或下劃線序列組成,并且大小寫(xiě)字母意義不同,變量名長(zhǎng)度沒(méi)有限制。
????????設(shè)置變量
習(xí)慣上用大寫(xiě)字母來(lái)命名變量。變量名以字母表示的字符開(kāi)頭,不能用數(shù)字。
????????變量調(diào)用
在使用變量時(shí),要在變量名前加上前綴“$”.
使用echo 命令查看變量值。eg:echo $A
????????變量賦值
1,定義時(shí)賦值:
變量=值 等號(hào)兩側(cè)不能有空格
eg:
STR="hello world"
A=9
2, 將一個(gè)命令的執(zhí)行結(jié)果賦給變量
A=`ls -la` 反引號(hào),運(yùn)行里面的命令,并把結(jié)果返回給變量A
A=$(ls -la) 等價(jià)于反引號(hào)
eg: aa=$((4+5))
bb=`expr 4 + 5 `
3,將一個(gè)變量賦給另一個(gè)變量
eg : A=$STR
????????變量疊加
eg: #aa=123
eg: #cc="$aa"456
eg: #dd=${aa}789
??????????????單引號(hào)和雙引號(hào)的區(qū)別:
現(xiàn)象:?jiǎn)我?hào)里的內(nèi)容會(huì)全部輸出,而雙引號(hào)里的內(nèi)容會(huì)有變化
原因:?jiǎn)我?hào)會(huì)將所有特殊字符脫意
????????列出所有的變量
set
????????刪除變量
unset NAME
eg :
# unset A 撤銷變量 A
# readonly B=2 聲明靜態(tài)的變量 B=2 ,不能 unset
????????用戶自定義的變量,作用域?yàn)楫?dāng)前的shell環(huán)境。
環(huán)境變量
????????用戶自定義變量只在當(dāng)前的shell中生效,而環(huán)境變量會(huì)在當(dāng)前shell和其所有子shell中生效。如果把環(huán)境變量寫(xiě)入相應(yīng)的配置文件,那么這個(gè)環(huán)境變量就會(huì)在所有的shell中生效。
????????export 變量名=變量值 申明變量
作用域:當(dāng)前shell以及所有的子shell。
位置參數(shù)變量
????????在 Linux 的命令行中,當(dāng)一條命令或腳本執(zhí)行時(shí),后面可以跟多個(gè)參數(shù),我們使用位置參數(shù)變量來(lái)表示這些參數(shù)。
其中,$0 代表命令行本身,$1 代表第 1 個(gè)參數(shù),$2 代表第 2 個(gè)參數(shù),依次類推。當(dāng)參數(shù)個(gè)數(shù)超過(guò) 10 個(gè)時(shí),就要用大括號(hào)把這個(gè)數(shù)字括起來(lái),例如,${10} 代表第 10 個(gè)參數(shù),${14} 則代表第 14 個(gè)參數(shù)。舉個(gè)例子:
[root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog
如果執(zhí)行這樣一條命令,則 $0 的值就是 ls 命令本身,$1 的值就是 anaconda-ks.cfg 這個(gè)文件,$2 是 install.log 文件,$3 是 install.log.syslog 文件。
????????在 Shell 中可以識(shí)別的位置參數(shù)變量如表 1 所示。

[1] 位置參數(shù)變量要用于向命令或程序腳本中傳遞信息,比如,我們想要寫(xiě)一個(gè)計(jì)算器,要告訴程序應(yīng)該運(yùn)算哪個(gè)字符,這時(shí)就需要通過(guò)位置參數(shù)變量向腳本中傳遞數(shù)值,命令如下:

[2] $、 $@ 、 $#的作用,以下面的例子介紹:

[3] $和$@ 的區(qū)別,以下面的例子介紹:

預(yù)定義變量
