1谴蔑、shell 概述
A豌骏、是什么?
shell 是一門計算機(jī)語言龟梦,和 python | Java 一樣,都可以編寫程序
A-1窃躲、shell字面意思: 殼(相對核而言)计贰,核:指操作系統(tǒng),shell 是保護(hù)操作系統(tǒng)的
A-2、計算機(jī)操作系統(tǒng)只能識別 0 和 1 組成的機(jī)器碼蒂窒,現(xiàn)在我們是通過GUI|CLI 來間接操作操作系統(tǒng)
??GUI(圖形化界面) | CLI(命令行) 在用戶與操作系統(tǒng)之間躁倒,相當(dāng)于橋梁、中介的作用刘绣,結(jié)構(gòu)上看,GUI和CLI 保護(hù)操作系統(tǒng)
A-3挣输、GUI 與 CLI 就是通過 Shell 實現(xiàn)的
B留拾、為什么?
通過shell按照需求編寫一些程序
C疏尿、怎么用?(linux)
C-1、分類
??第一類:GUI樣式的shell
??第二類:CLI樣式的shell(重點)
??專指: Linux 下的 shell 編程
C-2、流程
??1)板祝、創(chuàng)建一個文本文檔,后綴名是 .sh 文檔名要做到見名知意
??2)躲惰、再在文本文件中錄入一個命令
????echo "xxxx" 在命令行模式下直接輸出數(shù)據(jù)
????規(guī)范:第一行固定格式乡洼,這是解釋器聲明: #!/bin/bash
????作用:指定腳本解析的解釋器
??3)逻族、執(zhí)行 .sh 文件(.sh又稱為shell 腳本蜻底,里面放DOS命令)
????方式1: sh(bash) shell文件
????方式2: 絕對路徑(/xxx/yyy/abc.sh) 或 相對路徑(./abc.sh),注意:開啟所有權(quán)限 chmod 777 abc.sh
????方式3: source abc.sh(source 相當(dāng)于 ./)
D聘鳞、練習(xí)
練習(xí)1:在命令行輸出當(dāng)前所在目錄:pwd
2薄辅、shell 語法: 注釋
A、是什么?
注釋是程序中非功能性說明文本
B抠璃、為什么?
增強(qiáng)程序的易讀性站楚,易維護(hù)性
C、怎么用?
注釋量占到代碼總量的 30% -- 50%
單行注釋(常用):一次只注釋一行
格式: # 注釋文本
多行注釋(了解搏嗡,基本不用):一次可以注釋多行
:<<自定義的標(biāo)記
??第一行注釋
??第二行注釋
??.....
自定義標(biāo)記
3窿春、shell 語法: 變量
A、是什么?
程序=數(shù)據(jù)+數(shù)據(jù)操作
變量就是數(shù)據(jù)的載體,變量之所以稱之為變量采盒,是因為其中的值可以改變
B旧乞、為什么?
變量為數(shù)據(jù)設(shè)置一個引用,以后再使用這個數(shù)據(jù)時磅氨,可以通過引用獲取數(shù)據(jù)
C良蛮、怎么用?(重點)
變量創(chuàng)建:
??格式: 變量名="變量值"
??注意1:變量名
????a)、不能數(shù)字開頭
????b)悍赢、變量名不能有空格這種特殊字符
????c)决瞳、起名做到見名知意
????d)货徙、變量名不要使用關(guān)鍵字
??注意2:賦值符號
????=左右兩側(cè)不要有空格
??注意3:變量值
????a)、變量值可以不使用引號皮胡,但是如果有空格痴颊,必須使用 "xxx" 或者 'xxx'
????b)、"xxx" 和 'xxx' 的區(qū)別屡贺,變量之間賦值時蠢棱,如果是 變量2="${變量1}",那么賦的是變量1的值
????如果是 變量2='${變量1}' 只是賦值了變量1的調(diào)用格式甩栈,就是echo ${變量2} 返回的是${變量1}泻仙,而不是變量1的值
變量查詢:
??格式:"${變量名}" ----- 標(biāo)準(zhǔn)格式
??注意:其他格式(不建議使用):${變量名} 或者 $變量名
變量修改:
??格式:同變量新增
變量刪除:
??格式:unset 變量名
D、變量分類
D-1量没、本地(局部)變量
??只有當(dāng)前 shell 可以使用的變量
D-2玉转、全局變量(靜態(tài)變量)(了解)
??被多個 shell 共享的變量
??需求:如何將本地變量轉(zhuǎn)換成全局變量
????思想:將本地變量設(shè)置為全局變量就是要將本地變量導(dǎo)出到共享空間
????格式: export 局部變量
??查詢?nèi)肿兞? env
??注意1:如果是全局變量,建議變量名所有字母都大寫
??注意2:全局變量要慎用
D-3殴蹄、內(nèi)置變量(特殊變量)
??需求:編寫shell動態(tài)獲取某個目錄下的子級(要獲取的目錄不一定)
??實現(xiàn)流程:
??1)究抓、shell 調(diào)用時,可以傳入要操作的目錄
????格式: sh abc.sh 某個目錄
??2)袭灯、shell 執(zhí)行時刺下,可以獲取調(diào)用傳入的目錄
????格式:ls $1 (代表傳入的第一個參數(shù))
上述流程其實就是傳參以及參數(shù)解析的過程,這個參數(shù)就可以稱之為內(nèi)部變量
特殊變量語法總結(jié):
??應(yīng)用場景稽荧,程序執(zhí)行時有些數(shù)據(jù)是可變的橘茉,可以調(diào)用腳本時,傳入這些可變數(shù)據(jù)姨丈,腳本中解析獲取
??調(diào)用格式: sh xxx.sh 參數(shù)1 參數(shù)2 參數(shù)3 .....
??解析格式: $N 獲取第 N 個參數(shù)
??優(yōu) 點: 動態(tài)傳值捺癞,更靈活
??注 意: $N 獲取第 N 個參數(shù),但是 N 最大就到 9
????$0 獲取腳本文件名
????$* 獲取所有參數(shù)
????$# 獲取參數(shù)個數(shù)
D-4构挤、擴(kuò)展:讀取鍵盤錄入
??需求:編寫shell動態(tài)獲取某個目錄下的子級(目錄不一定,要讓調(diào)用者指定)
??格式: read_ -p_"提示語句:"_變量名 (注意:_是空格!!!!)
??作用:執(zhí)行到此時髓介,程序掛起,等待用戶錄入數(shù)據(jù)筋现,錄入數(shù)據(jù)后唐础,回車,錄入的數(shù)據(jù)會賦值給變量
??優(yōu)點:動態(tài)獲取數(shù)據(jù)矾飞,更靈活!!!!!
E一膨、變量特殊賦值(記住)
需求:將某個命令的結(jié)果賦值給一個變量
格式:變量名=`命令`
F洒沦、練習(xí)
練習(xí)1:使用shell腳本豹绪,輸出當(dāng)前所在的目錄
知識點:將命令結(jié)果賦值給變量
練習(xí)2:計算/etc目錄下有多少個文件,用shell腳本實現(xiàn)
新知識點:獲取某個目錄下子級個數(shù)
固定格式:ls 目錄 | wc -l
練習(xí)3:實現(xiàn)統(tǒng)計用戶指定目錄下的文件個數(shù)申眼,用 shell 腳本實現(xiàn)
知識點:怎么動態(tài)獲取數(shù)據(jù)?(特殊變量或者讀取鍵盤錄入)
4瞒津、shell 語法: 運(yùn)算符
A蝉衣、是什么?
是變量執(zhí)行運(yùn)算時使用的一些特殊符號
B、為什么?
因為程序中頻繁使用算數(shù)運(yùn)算巷蚪、邏輯運(yùn)算病毡、比較運(yùn)算....等算法
C、怎么用?
運(yùn)算符分類
C-1屁柏、算數(shù)運(yùn)算符
??格式: $((數(shù)學(xué)表達(dá)式))
??運(yùn)算符: + - * / % ----> 加減乘除取余
??注意: 一般計算機(jī)語言中除法運(yùn)算只取商
C-2啦膜、比較運(yùn)算符:返回的是 boolean 值(特殊: 0為true 1為false)
??格式: [ 表達(dá)式 ] ---- 注意:[] 中有兩個空格,兩個空格中添加表達(dá)式
??查看結(jié)果: $?
??運(yùn)算符: 不能直接使用 > < >= <= == !=
??使用對應(yīng)的參數(shù) -gt(>) -lt(<) -ge(>=) -le(<=) -eq(==) -ne(!=) 記住
????g = greater
????t = than
????l = less
????e = equals
????n = not
C-3淌喻、邏輯運(yùn)算符:返回 boolean 值(特殊: 0為true 1為false)
??格式: [ 表達(dá)式 ]
??查看結(jié)果: $?
??運(yùn)算符: -a 與-o或 僧家!非
C-4、字符串比較:返回 boolean 值
??格式: [ 表達(dá)式 ]
??查看結(jié)果: $?
??運(yùn)算符: == 判斷兩個字符串內(nèi)容是不是一樣
??!= 判斷兩個字符串內(nèi)容是不是不一樣
?? -z 判斷單個字符串長度是不是0(判斷字符串是不是空)
C-5裸删、文件判斷:返回 boolean 值
??格式: [ 表達(dá)式 ]
??查看結(jié)果: $?
??運(yùn)算符:-d: 判斷是不是文件夾
??????-f: 判斷是不是文件
??????-e: 判斷是不是存在
??變體:
????test -參數(shù) 路徑 等價于 [ -參數(shù) 路徑 ]
????例如:test -d ${myDir} 等價于 [ -d ${myDir} ]
D八拱、練習(xí)
練習(xí)1:判斷 /home/admin(/root)目錄是否為空
思路:現(xiàn)獲取目錄子級文件個數(shù),判斷是否大于 0
練習(xí)2:通過用戶輸入任意目錄判斷是否為空
5烁落、shell 語法: 函數(shù)(方法)
A乘粒、是什么?
程序=數(shù)據(jù)+數(shù)據(jù)操作
變量是數(shù)據(jù)的載體豌注,函數(shù)是數(shù)據(jù)操作的載體伤塌,是程序中最小的功能(封裝)單元,在函數(shù)中一般會封裝一個具有特定功能的實現(xiàn)
B、為什么?
優(yōu)點1:代碼結(jié)構(gòu)更規(guī)整轧铁,易維護(hù) 易讀
優(yōu)點2:實現(xiàn)了功能復(fù)用
C每聪、怎么用?
C-1、函數(shù)聲明
function(可選) 函數(shù)名(){
??函數(shù)體
}
C-2齿风、函數(shù)調(diào)用
函數(shù)名
C-3: 注意
1药薯、函數(shù)不調(diào)用不執(zhí)行(所有計算機(jī)語言通用)
2、順序上必須先聲明再調(diào)用(弱類型計算機(jī)語言的特點)
C-4救斑、函數(shù)分類
類型1:無參數(shù)無返回值
類型2:有參數(shù)
??聲明語法:獲取參數(shù)使用
????$N : 獲取第 N 個參數(shù)童本,N必須小于等于 9
????$0:腳本文件名
????$*:所有參數(shù)
????$#:參數(shù)個數(shù)
??調(diào)用語法:參數(shù)傳遞
????函數(shù)名 參數(shù)1 參數(shù)2 .....
??如下圖:
類型3:有返回值(了解)
??聲明語法:
????函數(shù)名(){
??????....
??????return xxx;
????}
??調(diào)用語法:
????函數(shù)名
????$? 查看結(jié)果
??注意:函數(shù)的返回值在 shell 中兩種:
????return 0 : 函數(shù)調(diào)用正常
????非0 : 函數(shù)執(zhí)行有誤
??在shell中的函數(shù)中的變量在大括號外面也能調(diào)用
D、練習(xí)
練習(xí)1:讀取鍵盤錄入脸候,錄入長方形的長和寬穷娱,編寫求周長和面積的函數(shù),調(diào)用并輸出周長和面積的值
6运沦、shell 語法: 流程控制(重點)
A泵额、是什么?
就是控制代碼的執(zhí)行順序,讓代碼實現(xiàn)分支或循環(huán)執(zhí)行
B、為什么?
組織多樣的業(yè)務(wù)邏輯
C携添、分類?
分支: if + case
循環(huán): for + while
7嫁盲、shell 語法:流程控制分支實現(xiàn)之 if
A-1、格式1(單分支)
語法:
??if [ boolean表達(dá)式 ]
??then
??????code......
??fi
舉例:
(需求: 錄入年齡烈掠,判斷是否成人羞秤,如果成人了輸出"成年人")
A-2缸托、格式2(雙分支)
語法:
??if [ boolean表達(dá)式 ]
??then
????code.....
??else
????code.....
??fi
舉例:
(需求: 錄入年齡,判斷是否成人锥腻,如果成人了輸出"成年人"嗦董,否則輸出未成年)
A-3、格式3(多分支)
語法:
??if [ boolean表達(dá)式 ]
??then
????code....
??elif [ boolean表達(dá)式 ]
??then
????code....
??elif 可以出現(xiàn)多次
??else
????code....
??fi
舉例:
? (需求: 錄入年齡瘦黑,如果小于18歲京革,輸出未成年,如果大于等于18歲小于等于30歲幸斥,輸出青年匹摇,如果大于30歲小于50歲,輸出中年甲葬,否則廊勃,輸出老年)
B、練習(xí)
練習(xí)1:判斷用戶輸入的用戶名和密碼是否為admin 123456,如果是則提示登錄成功经窖,否則提示失敗
知識點:if else +運(yùn)算符
練習(xí)2:輸入數(shù)字坡垫,判斷是否大于0,如果大于0則將該數(shù)字-1并輸出画侣,否則+1輸出
練習(xí)3:判斷用戶輸入的目錄是否存在冰悠,如果存在則統(tǒng)計目錄下的文件個數(shù),否則提示用戶該目錄不存在
練習(xí)4:判斷學(xué)生的成績配乱,大于90-100提示優(yōu)秀溉卓,80-90之間提示良好,70-80之間則提示一般,60-70之間提示 及格搬泥。其他則提示不及格
練習(xí)5:判斷用戶輸入的內(nèi)容是否為空桑寨,為空則提示,不為空則判斷是否為目錄忿檩,不為目錄則判斷是否為文件尉尾,否則提示錯誤信息
知識點:多分支
8、shell 語法:流程控制分支實現(xiàn)之case(了解)
A燥透、格式
語法:
??case 變量(用戶輸入的數(shù)據(jù)) in
??值1)
????code;;
??值2)
????code;;
??值3)
????code;;
??.....
??*)
????code;;
??esac
舉例:
(需求:模擬游戲級別選擇沙咏,讀取鍵盤錄入的數(shù)字,如果是數(shù)字1兽掰,那么輸出簡單芭碍, 如果是數(shù)字2,那么輸出一般孽尽,如果是數(shù)字3輸出困難窖壕,其他輸出數(shù)據(jù)有誤)
注意:
??1、case 能實現(xiàn)的 if elif 也能實現(xiàn)
??2、if elif 能實現(xiàn)的瞻讽,case不一定能實現(xiàn)了
??3鸳吸、語法上 if elif 更簡單
??4、但case執(zhí)行效率高
B速勇、練習(xí)
練習(xí)1:輸入一個序號晌砾,判斷該用戶選擇哪款產(chǎn)品,A:筆記本 B:電飯煲 C:小臺燈
練習(xí)2:請輸入對客服的滿意度烦磁,【0-3】不滿意养匈,【4-6】滿意,【7-9】非常滿意 (了解)
case 也可以執(zhí)行區(qū)間判斷都伪,但是區(qū)間范圍局限于: 0 - 9
區(qū)間格式 :[開始數(shù)字-結(jié)束數(shù)字]
9呕乎、shell 語法:流程控制循環(huán)實現(xiàn)之for
A、格式
語法:
??for 變量名 in 列表(v1 v2 v3 ......)
??do
????code.....#循環(huán)體
??done
舉例:
(需求:遍歷(迭代) 1-10之間所有整數(shù))
B陨晶、注意
seq 命令優(yōu)化 for 循環(huán)
格式1: seq 參數(shù)NUM ---> 默認(rèn)遍歷 [1-NUM] 之間的所有整數(shù)
??例如:for ele in `seq 15`......
格式2: seq 參數(shù)NUM1 參數(shù)NUM2 ----> 遍歷 [NUM1-NUM2]之間的所有整數(shù)
格式3: seq 參數(shù)NUM1 參數(shù)NUM2 參數(shù)NUM3 ----> 遍歷 [NUM1-NUM3] 之間的整數(shù)猬仁,但是每次遞增 NUM2 值,不指定 NUM2 每次默認(rèn)遞增1先誉, NUM2 又稱之為步進(jìn)值
C湿刽、練習(xí)
求1-100之間的和
10、shell 語法:流程控制循環(huán)實現(xiàn)之while
A褐耳、格式
語法:
??while [ boolean表達(dá)式 ]
??do
????code.....
??done
舉例:
(需求:遍歷 1-10之間所有整數(shù))
B诈闺、練習(xí)
求1-100之間的和
綜合練習(xí):輸入一個目錄,判斷目錄是否存在漱病,如果不存在則給出提示买雾,如果存在則提示輸入要創(chuàng)建的文件名把曼,(前提:要先進(jìn)入目錄)判斷創(chuàng)建的文件是否存在杨帽,如果不存在,則繼續(xù)創(chuàng)建嗤军,否則提示該文件已經(jīng)存在
需求:目錄操作與文件操作注盈,分別兩個函數(shù)實現(xiàn),兩個函數(shù)中分別實現(xiàn)業(yè)務(wù)邏輯(分支語句)
11叙赚、shell 語法其他:重定向
A老客、是什么?
可以將命令產(chǎn)生的數(shù)據(jù)保存到磁盤文件
B、為什么?
一種序列化(持久化)機(jī)制震叮,可以持久的保存數(shù)據(jù)
C胧砰、怎么用?
格式1: 命令 1>> 磁盤文件 (將正常結(jié)果輸出到文件)
??例如:ls /usr 1>> hello.txt
格式2: 命令 2>> 磁盤文件 (將錯誤結(jié)果輸出到磁盤文件)
??例如:lsxz /usr 2>> hello.txt
12、shell 語法其他:數(shù)組
A苇瓣、是什么?
數(shù)組也是變量尉间,但是是特殊的變量,一般變量只能存儲一個值,而數(shù)組可以存儲多個值
B哲嘲、為什么?
因為數(shù)組功能更強(qiáng)大
C贪薪、怎么用?
數(shù)組創(chuàng)建
??變量名=(值1 值2 值3 .... )
數(shù)組查詢
??查某個元素: ${數(shù)組名[索引]}---->索引從 0 開始
??查詢所有元素: ${數(shù)組名[*]} 或者 ${數(shù)組名[@]}
??查詢元素個數(shù): ${#數(shù)組名[*]} 或者 ${#數(shù)組名[@]}
數(shù)組修改
??變量名[索引]=新值
數(shù)組刪除
??unset 數(shù)組名(同變量刪除)
D、應(yīng)用
集合循環(huán)遍歷數(shù)組元素