參考:《shell腳本-菜鳥教程》
1.shell腳本簡介
1.1. 什么是shell
百度百科解釋如下:
1.2 . 什么是腳本
百度百科解釋如下:
腳本語言又被稱為擴建的語言, 或者動態(tài)語言, 是一種編程語言, 用來控制軟件應(yīng)用程序, 腳本通常是以文本 (ASCⅡ) 保存, 只是在被調(diào)用時進(jìn)行解釋或者編譯
簡單的來說:
就是一條條可執(zhí)行的命令。這些命令保存在一個文本文件里面漾橙,稱為腳本文件。
常見的腳本文件有: Javascript腳本温自,sql腳本,shell腳本,jsp腳本等等
1.3 什么是shell腳本
百度百科 解釋如下:
簡單的來說
就是把各種linux命令放入存放到一個文本文件中吃既,然后去執(zhí)行這個文本文件斧蜕,就像把所有的SQL放入到一個文本中渺杉,然后去執(zhí)行SQL文件是一樣的道理
1.4 shell腳本好處
- 提交程序開發(fā)效率
- 批量處理蛇数,加快任務(wù)完成進(jìn)度
2. shell分類
-
Bourne Shell
UNIX 最初使用的 shell,并且在每種 UNIX 上都可以使用, 在 shell 編程方面相當(dāng)優(yōu)秀是越,但在處理與用戶的交互方面做得不如其他幾種shell耳舅。
-
Bourne Again Shell(/bin/bash)
Linunx默認(rèn)的shell,是Bourne shell 的擴展,簡稱 Bash倚评,與 Bourne shell 完全向后兼容,并且在Bourne Shell基礎(chǔ)上加了很多新的特性浦徊。因此也更加靈活。所以一般來說shell腳本都會執(zhí)行它為執(zhí)行路徑蔓纠。也可以認(rèn)為
-
C Shell
主要是為了讓用戶更容易的使用交互式功能辑畦,并把ALGOL風(fēng)格的語法結(jié)構(gòu)變成了C語言風(fēng)格吗蚌。它新增了命令歷史腿倚、別名、文件名替換蚯妇、作業(yè)控制等功,其內(nèi)部命令共有52個敷燎,現(xiàn)在已經(jīng)被
tc shell
所取代了。 -
K Shell
Korn shell 是與 Bourne shell 向后兼容的箩言,并且包含大部分的 Bourne shell 的特點和幾個 C shell 的最好特點硬贯。許多安裝腳本都是用了ksh,其內(nèi)部共有42條命令。
-
TC Shell
Tcsh是csh的增強版陨收,并且完全兼容csh饭豹。它不但具有csh的全部功能,還具有命令行編輯务漩、拼寫校正拄衰、可編程字符集、歷史紀(jì)錄饵骨、作業(yè)控制等功能翘悉,以及C語言風(fēng)格的語法結(jié)構(gòu)。
3. shell 快速入門
3.1 準(zhǔn)備工作
-
安裝Linux系統(tǒng)居触,這里我安裝虛擬機妖混。配置如下:
image-20200615140614256
3.2 shell -helloword
-
在當(dāng)前文件夾下新建一個
hello.sh
image-20200615140830090解釋:
shell腳本文件后綴名必須為 xx.sh
-
文件內(nèi)容如下
#!/bin/bash #這是一個注釋 echo '這是第一個腳本'
解釋:
腳本文件第一行必須為
#!/bin/bash
.其含義是告訴系統(tǒng)腳本文件的解釋器路徑是什么老赤。shell腳本里面的注釋為:
#注釋
echo 輸出語句,類似于java中
System.out.print
-
修改文件權(quán)限
image-20200615141453003解釋:
既然hello.sh是一個腳本文件,那么就需要去執(zhí)行制市,可是創(chuàng)建出來的文件沒有執(zhí)行權(quán)限抬旺,因此需要增加執(zhí)行權(quán)限。
chmod +x hello.sh
-
執(zhí)行腳本
./hello.sh
image-20200615141743283注意:
一定要寫成
./hello.sh
,如果寫成hello.sh
,那么就會出現(xiàn)下面的錯誤image-20200615141858511這是因為直接寫
hello.sh
息堂,linux 系統(tǒng)會去PATH
里尋找有沒有叫hello.sh
的嚷狞,而只有/bin
,/sbin
,/usr/bin
,/usr/sbin
等在 PATH 里荣堰,而當(dāng)前目錄通常不在PATH
里床未,所以寫成hello.sh
是會找不到命令的,要用./hello.sh
告訴系統(tǒng)說振坚,就在當(dāng)前目錄找薇搁。當(dāng)然除此以外還有另外一種方式去運行腳本:
這種運行方式是,直接運行解釋器渡八,其參數(shù)就是 shell 腳本的文件名啃洋,如:
/bin/bash hello.sh
image-20200615142151341
3.3 小練習(xí)
-
在到/home目錄下,創(chuàng)建一個aa.txt文件
vim test1.sh
文件內(nèi)容如下:
#!/bin/bash #進(jìn)入home目錄 cd /home #創(chuàng)建文件 touch aa.txt echo '執(zhí)行成功'
增加文件權(quán)限
chmod +x test1.sh
執(zhí)行腳本
./test1.sh
image-20200615143300976注意屎鳍,切換到root用戶下執(zhí)行宏娄,否則可能會有權(quán)限問題。
查看執(zhí)行結(jié)果:
image-20200615143352435通過上述的練習(xí)我們可以知道逮壁,所謂的腳本就是將多個命令堆積到一塊孵坚,然后去執(zhí)行這個腳本。當(dāng)然這只是shell基本寫法窥淆,除了這個基本寫法以外還有一些高級寫法卖宠,接下來我們就來看看高級寫法
3.4 變量
3.4.1 基本變量
-
定義變量
name='value' name="value"
- 變量名只能由英文字母,數(shù)字和下劃線組成忧饭,不能以數(shù)字開頭扛伍。
- 變量名中間不能有空格
- 不能使用標(biāo)點符號
- 不能使用關(guān)鍵字(可以使用help指令查看關(guān)鍵字)
-
使用變量
your_name="hello" echo $your_name
使用變量就在變量名前面加上美元符號即可
-
案例
#!/bin/bash #字符串需要加上單引號和雙引號 name="lisi" #數(shù)字可以不加不加 num=1 #boolean類型的數(shù)據(jù)也可以不加 flag=true # 使用變量 $變量名 echo $name echo $num echo $flag
執(zhí)行結(jié)果如下
image-20200615145606780注意:
雙引號能夠識別變量,且能夠使用轉(zhuǎn)義
單引號不能夠識別變量且不能夠轉(zhuǎn)移词裤,只能原樣輸出刺洒。如下:
#!/bin/bash num=123 test1="hello$num" test2='hello$num' echo $test1 echo $test2
執(zhí)行結(jié)果如下:
image-20200615150340386 -
定義變量,輸入日期格式吼砂,格式為
年:月:日 時:分:秒
#!/bin/bash dt=`date +'%F %T'` echo $dt
命令的結(jié)果賦值給一個變量逆航,需要加上反單引號
3.4.2 只讀變量
使用 readonly
命令可以將變量改為只讀變量,只讀變量不能夠再去賦值帅刊,如下:
#!/bin/bash
name=lisi
readonly name
name=wangwu
echo $name
執(zhí)行報錯纸泡,從下圖的錯誤顯示看,name是一個只讀變量
3.4.3 刪除變量
使用unset
刪除變量
#!/bin/bash
name="lisi"
age=15
unset name
echo $age
echo $name
執(zhí)行可知
如圖,當(dāng)把name變量刪除后女揭,打印出來的就只有空行了蚤假。
3.4.4 接收用戶輸入
使用read -p 提示信息 變量名
去接收用戶的參數(shù)
#!/bin/bash
read -p '請輸入姓名' name
echo $name
3.5 字符串操作
3.5.1 拼接字符串
-
單引號
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的吧兔;
- 單引號字串中不能出現(xiàn)單獨一個的單引號(對單引號使用轉(zhuǎn)義符后也不行)磷仰,但可成對出現(xiàn),作為字符串拼接使用境蔼。
-
雙引號
- 雙引號里可以有變量
- 雙引號里可以出現(xiàn)轉(zhuǎn)義字符
-
案例
-
拼接字符串
#!/bin/bash name="lisi" #單引號拼接字符串 desc='你的名字是'$name'' #雙引號拼接字符串 desc2="你的名字是$name" echo $desc $desc2
image-20200615153232497
-
3.5.2 字符串長度
#!/bin/bash
name="lisi"
#單引號拼接字符串
desc='你的名字是'$name''
#雙引號拼接字符串
desc2="你的名字是$name"
echo $desc $desc2
# 獲取字符串長度
echo ${#desc2}
3.5.3 截取字符串
#!/bin/bash
name="lisi"
#單引號拼接字符串
desc='你的名字是'$name''
#雙引號拼接字符串
desc2="你的名字是$name"
echo $desc $desc2
# 獲取字符串長度
echo ${#desc2}
#從索引為2的位置開始連續(xù)截取4個字符灶平,索引從0開始
echo ${desc:2:4}
3.6 數(shù)組
3.6.1 簡介
bash 支持一維數(shù)組,不支持多維數(shù)組箍土,與java一樣逢享,數(shù)組下標(biāo)從0開始,數(shù)組大小沒有限制吴藻,對數(shù)組里面的元素類型也沒有限制
3.6.2 定義數(shù)組
-
語法1
array_name=(value1 value2 ...);
-
語法2
array_name=( value1 value2 value3 ... ) array_name[0]=value0 array_name[1]=value1 ...
3.6.3 獲取數(shù)組值
-
語法
#獲取數(shù)組特定元素 ${array_name[index]} #獲取數(shù)組所有元素 ${array_name[@]}
-
案例
#!/bin/bash # 定義數(shù)組 里面的數(shù)組類型沒有特定的顯示 array=(1 5 6 "lisi") # 打印數(shù)組里面所有的元素 echo ${array[@]} # 打印數(shù)組下標(biāo)為2的元素 echo ${array[2]} echo "------------------------------------------------" #數(shù)組第二種方式 arr=( true "lisi" 1 5 ) echo ${arr[1]} echo ${arr[@]} echo "---------------------------------------------" #數(shù)組的第三種方式 arr2[0]=1 arr2[1]=true arr2[2]="wangwu" echo ${arr2[@]}
執(zhí)行腳本
image-20200615155525521
3.6.4 數(shù)組長度
#!/bin/bash
array=(1 5 6 "lisi")
length=${#array[@]}
echo $length
執(zhí)行結(jié)果如下:
3.7 注釋
-
單行注釋
#這是一個注釋,到時候注釋會被解釋器忽略掉 # 通過每一行加一個 # 號設(shè)置多行注釋瞒爬,像這樣 ##### tomcat start ##### # # # tomcat config # # ##### tomcat end #####
-
多行注釋
:<<EOF 這是一個注釋1 這是一個注釋2 這是一個注釋3 ... EOF
#!/bin/bash :<<EOF 注釋1 注釋2 EOF array=(1 5 6 "lisi") length=${#array[@]} echo $length
執(zhí)行結(jié)果如下:
image-20200615160345856