shell脚本编程基础(上)
目錄
(一)shell介紹
1.什么是shell
?擴展知識
2. shell功能
(二)shell語法
2.1 如何書寫一個shell腳本
0x01 shell腳本的命名:
0x02 shell腳本格式:
0x03 shell中的注釋使用#號
2.2 如何運行一個shell腳本
2.3 shell中的特殊符號
2.4 shell中管道的運用
2.5? shell重定向
2.6? shell數學運算
2.7 退出腳本
(三) shell格式化輸出
0x01. echo命令介紹
0x02 顏色代碼
格式如下:
(四)shell基本輸入
1. read命令
(五)shell變量
1.變量介紹
2.變量分類
3.定義變量
3.1定義變量
3.2讀取變量內容
3.3 取消變量unset
3.4定義全局變量export
3.5定義永久變量
(六)shell數組
0x01.數組介紹
0x02.基本數組
2.1數組語法
2.2數組讀出
2.3數組賦值
方法二: 一次賦多個值
2.4查看數組
2.5訪問數組元素
2.6遍歷數組
0x03.關聯數組
3.1定義關聯數組
3.2關聯數組賦值
3.3查看數組
3.4訪問數組元素
3.5遍歷數組
0x04.案例分享——學員信息系統
(七)、shell流程控制-if判斷語句
0x01. shell中的運算
1.1數學比較運算
1.2字符串比較運算
1.3 文件比較與檢查
1.4 邏輯運算
1.5 賦值運算
0x02. if語法
2.1語法一:單if語句
2.2語法二:if-then-else語句
2.3語法三:if-then-elif語句
0x03. if高級應用
(一)shell介紹
1.什么是shell
shell是一個程序,采用C語言編寫,是用戶和Linux內核溝通的橋梁。它既是一種命令語言,又是一種解釋性的編程語言。通過一個圖標來查看以下設立了的作用,如圖1-1
圖1-1 shell的執行過程?擴展知識
- kernel(內核):為軟件服務,接收用戶或軟件指令驅動硬件,完成工作;
- shell:命令解釋器
- user:用戶接口,對接用戶
從上圖可以看出,shell在操作系統中起到了承接用戶和系統內核的作用。那為什么步直接用戶對內核呢?
原因很簡單,因為內核處理的都是二進制,而用戶處理的都是高級語言。簡而言之,如果沒有shell,你希望告訴你喜歡的妹子:我愛你。你需要經過以下步驟:
為了讓所有人都能夠快速、方便地使用計算機,我們開發的系統,開發人員通過shell解決了這個問題。使任何一個希望通過計算機來工作、娛樂的人都能夠快速操作計算機。
2. shell功能
- 命令行解釋功能
- 啟動程序
- 輸入輸出重定向
- 管道連接
- 文件名置換(echo /*)
- 變量維護
- 環境控制
- shell編程
(二)shell語法
shell腳本就是將完成一個任務的所有命令按照執行的先后順序,自上而下寫入到一個文本文件中,然后給予執行權限。
2.1 如何書寫一個shell腳本
0x01 shell腳本的命名:
名字要有意義,最好不要用a、b、c、d、1、2、3、4這中方式命名;雖然在linux系統中,文件沒有擴展名的概念,依然建議你用.sh結尾;名字不要太長,最好能在30個字節以內解決。例如check_memory.sh
0x02 shell腳本格式:
shell腳本開頭必須指定腳本運行環境,以#!這個特殊符號組合了組成。如: #!/bin/bash 指定該腳本是運行解析由/bin/bash來完成的:
0x03 shell中的注釋使用#號
#后面加上注釋內容
2.2 如何運行一個shell腳本
- 腳本運行需要執行權限,當我們給一個文件賦予執行權限后,該腳本就可以運行
- 如果不希望賦予腳本執行權限,那么可以使用bash命令來運行未給予執行權限的腳本
2.3 shell中的特殊符號
| 符號 | 描述 |
| ~ | 家目錄 # cd ~ 代表進入用戶家目錄 |
| ! | 執行歷史命令 ~~執行上一條命令 |
| $ | 變量中取內容符 |
| + – * / % | 對應數學運算 加 減 乘 除 取余 |
| & | 后臺執行 |
| * | 星號是shell中的通配符,匹配所有 |
| ? | 問號是shell中的通配符,匹配除回車以外的一個字符 |
| ; | 分號可以在shell中一行執行多個命令,命令hi加用分號分隔 |
| | | 管道符,上一個命令的輸出作為下一個命令的輸入 cat filename | grep “abc” |
| \ | 轉義字符 |
| ` | | 反引號 命令中執行命令 echo “today is /date +%F/`” |
| ‘ ‘ | 單引號,腳本中字符串要用單引號引起來,但不同于雙引號的是,單引號不解釋變量 |
| ” “ | 雙引號,腳本中出現的字符串可以用雙引號引起來 |
2.4 shell中管道的運用
| 管道符在shell中使用是最多的,很多組合命令都需要通過組合命令來完成輸出。管道符其實就是下一個命令對上一個命令的輸出做處理。
2.5? shell重定向
2.6? shell數學運算
- expr 命令:只能做整數運算,格式比較古板,注意空格
- 使用bc計算器處理浮點運算,sacle=2代表小數點保留兩位
- 雙小圓括號運算,在shell中(())也可以用來做數學運算
2.7 退出腳本
- exit NUM:退出腳本,釋放系統資源,NUM代表一個整數,代表返回值。
(三) shell格式化輸出
- echo命令
- 顏色輸出
0x01. echo命令介紹
echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。 該命令的一般格式為:echo [ -n ]字符串
其中選項n表示輸出文字后不換行;字符串能加引號,也能不加引號。用echo命令輸出加引號的字符串時,將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作為字符串輸出,各字符串之間用一個空格分割。
- 功能說明:顯示文字。
- 語法:
補充說明:echo會將輸入的字符串送往標準輸出。輸出的字符串間以空白字符隔開,并在最后加上換行號
命令選項:
-n:不要在最后自動換行;
-e:若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出:
? 轉義字符:
?舉例:輸出一個菜單
#!/bin/bashecho -e "\t\t\t\tFruit Shop" echo -e "\t1) Apple" echo -e "\t2) Orange" echo -e "\t3) Banana"輸出
Fruit Shop1) Apple2) Orange3) Banana0x02 顏色代碼
腳本中echo顯示內容帶顏色顯示,echo顯示帶顏色,需要使用參數-e
格式如下:
echo -e “\033[字背景顏色;文字顏色m字符串\033[0m”例如:
echo -e “\033[41;36m something here \033[0m”(四)shell基本輸入
1. read命令
默認接受鍵盤的輸入,回車符代表輸入結束
(五)shell變量
1.變量介紹
變量:變量是編程中最常用的一種臨時在內存中存取數據的一種方式。
?從圖片可以看出,當我們在腳本中定義變量存值的時候,可以從以下方面看到變化:
2.變量分類
3.定義變量
3.1定義變量
變量格式:變量名=值
在shell編程中的變量名和等號之間不能有空格
變量命名規則:
注意:字符串要用單引號或雙引號引起來
3.2讀取變量內容
- 讀取變量內容符:$
- 讀取方法:$變量名
3.3 取消變量unset
unset name echo $name3.4定義全局變量export
export name='Tom'注意:
3.5定義永久變量
本地變量:用戶私有變量,只有本用戶可以使用,保存在家目錄下的.bash_profile、.bashrc文件中
全局變量:所有用戶都可以使用,保存在/etc/profile、/etc/bashrc文件中
#本地變量 tail -1 ~/.bash_profile name='baism'#全局變量 tail -1 /etc/profile export age=30(六)shell數組
0x01.數組介紹
????????一個變量只能存一個值,但是現實中又又很多值需要存儲,那么變量就有些拘謹了。比如做一個學員信息表,一個班50個人,每個人6條信息,我們需要定義300個變量才能完成。恐怖恐怖,這只是一個班的學生,一個學校呢?一個市呢?……
仔細想想上述的案例,一個學生六個信息:ID、姓名、性別、年齡、成績、班級。可不可以定義六個變量就能存儲這六類信息呢?答案是當然可以的!變量不行,我們就用數組。
0x02.基本數組
數組可以讓用戶一次賦予多個值,需要讀取數據時只需通過索引調用就可以方便讀出了
2.1數組語法
數組名稱=(元素1 元素2 元素3 ...)2.2數組讀出
${數組名稱[索引]}
索引默認是元素在數組中的排隊編號,默認第一個從0開始
2.3數組賦值
方法一:一次賦一個值
array0[0]='tom' array0[1]='jarry' array0[2]='natasha'方法二: 一次賦多個值
array2=(tom jack alice) array3=(cat /etc/passwd) #希望是將該文件中的每一個行作為一個元素賦值給數組array3 array4=(ls /var/ftp/Shell/for*) array5=(tom jack alice “bash shell”)2.4查看數組
declare -a declare -a array1='([0]=”pear” [1]=”apple” [2]=”orange” [3]=”peach”)' declare -a array2='([0]=”tom” [1]=”jack” [2]=”alice”)'2.5訪問數組元素
echo ${array1[0]} #訪問數組中的第一個元素 echo ${array1[@]} #訪問數組中所有元素 等同于 echo ${array1[*]} echo ${#array1[@]} #統計數組元素的個數 echo ${!array2[@]} #獲取數組元素的索引 echo ${array1[@]:1} #從數組下標1開始 echo ${array1[@]:1:2} #從數組下標1開始,訪問兩個元素2.6遍歷數組
默認數組通過數組元素的個數進行遍歷
echo ${ass_array2[index1]} echo ${ass_array2[index2]} echo ${ass_array2[index3]} echo ${ass_array2[index4]}0x03.關聯數組
關聯數組可以允許用戶自定義數組的索引,這樣使用起來更加方便、高效。
3.1定義關聯數組
申明關聯數組變量
declare -A ass_array1 declare -A ass_array23.2關聯數組賦值
方法一: 一次賦一個值
數組名[索引]=變量值 ass_array1[index1]=pear ass_array1[index2]=apple ass_array1[index3]=orange ass_array1[index4]=peach方法二: 一次賦多個值
ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]=’bash shell’)3.3查看數組
declare -A declare -A ass_array1=’([index4]=”peach” [index1]=”pear” [index2]=”apple” [index3]=”orange” )’ declare -A ass_array2=’([index4]=”bash shell” [index1]=”tom” [index2]=”jack” [index3]=”alice” )’3.4訪問數組元素
echo ${ass_array2[index2]} #訪問數組中的第二個元數 echo ${ass_array2[@]} #訪問數組中所有元數 等同于 echo ${array1[*]} echo ${#ass_array2[@]} #獲得數組元數的個數 echo ${!ass_array2[@]} #獲得數組元數的索引3.5遍歷數組
通過數組元數的索引進行遍歷,針對關聯數組可以通過數組元素的索引進行遍歷
echo ${ass_array2[index1]} echo ${ass_array2[index2]} echo ${ass_array2[index3]} echo ${ass_array2[index4]}0x04.案例分享——學員信息系統
#!/bin/bash for ((i=0;i<3;i++))doread -p "輸入第$((i + 1))個人名: " name[$i]read -p "輸入第$[$i + 1]個年齡: " age[$i]read -p "輸入第`expr $i + 1`個性別: " gender[$i] done clearecho -e "\t\t\t\t學員查詢系統" while :docp=0 # echo -e "\t\t\t\t學員查詢系統"read -p "輸入要查詢的姓名: " xm[ $xm == "Q" ]&&exitfor ((i=0;i<3;i++))doif [ "$xm" == "${name[$i]}" ];thenecho "${name[$i]} ${age[$i]} ${gender[$i]}"cp=1fidone[ $cp -eq 0 ]&&echo "not found student" done
(七)、shell流程控制-if判斷語句
0x01. shell中的運算
1.1數學比較運算
運算符解釋:
?
test 1 -eq 1;$? #0(shell中0為真,1為假) test 1 -lt 1;$? #11.2字符串比較運算
運算符解釋,注意字符串一定別忘了使用引號引起來
?
test 'abc' -n1.3 文件比較與檢查
?Demo:
file1 -nt file2 檢查file1是否比file2新 file1 -ot file2 檢查file1是否比file2舊 file1 -ef file2 檢查file1是否與file2是同一個文件 test -d /opt/shell;echo $? #0 test -e /opt/shell/shell_05.sh;echo $? #01.4 邏輯運算
?
if [ 1 -eq 1 ] && [ 2 -eq 2 ];then echo "yes";else echo "no";fi #yes邏輯運算注意事項:邏輯與 或 運算都需要兩個或以上條件,邏輯非運算只能一個條件。
1.5 賦值運算
=:賦值運算符
a=10 name='baism'0x02. if語法
2.1語法一:單if語句
適用范圍:只需要一步判斷,條件返回真干什么或者條件返回假干什么。
語句格式
if [ condition ] #condition 值為true or falsethencommands fiDemo:
????????判斷當前用戶是不是root,如果不是那么返回”ERROR: need to be root so that!“
#!/bin/bashif[ $USER != 'root' ]thenecho "ERROR:need to be so that"exit 1 fi2.2語法二:if-then-else語句
適用范圍:兩步判斷,條件為真干什么,條件為假干什么。
if [ condition ]thencommands1 elsecommands2 fiDemo:
????????判斷當前登錄用戶是管理員還是普通用戶,如果是管理員輸出”hey admin“ 如果是普通用戶輸出”hey guest“
if [ $USER == 'root' ]then echo "hey admin" else echo "hey guest" fi2.3語法三:if-then-elif語句
適用范圍:多于兩個以上的判斷結果,也就是多于一個以上的判斷條件。
if [ condition 1]thencommands1 elif [ condition 2]thencommands2....... elsecommandsX fiDemo:
????????通過一個腳本,判斷兩個整數的關系。
if [ $1 -gt $2 ]thenecho "$1 > $2" elif [ $1 -eq $2 ]thenecho "$1 = $2" elseecho "$1 < $2" fi0x03. if高級應用
- 條件符號使用雙圓括號,可以在條件中植入數學表達式
注意 雙小圓括號中的比較運算符 使用的是我們傳統的比較運算符 >>= == <<= !=
- 使用雙方括號,可以在條件中使用通配符
為字符串提供高級功能,模式匹配 r* 匹配r開頭的字符串
#!/bin/bash for i in r1 rr2 cc rr3doif [[ $i == r* ]];thenecho $ifi done為字符串提供高級功能,模式匹配 r* 匹配r開頭的字符串
總結
以上是生活随笔為你收集整理的shell脚本编程基础(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品通过WHQL测试认证有哪些好处?
- 下一篇: 微信公众号开发之用户分组