初步認識shell指令碼編程
編程是使用人類自然語言或機器語言進行程式原始碼書寫的過程。這是我們都知道的,因為畢竟IT,都編程過什麼學產生績管理系統,圖書館管理系統。等等。
編程為了能夠讓使用者在使用電腦的時候,可以讓電腦以非互動的方式完成某些任務;此時,使用者需要將此類任務編輯成為一個檔案,並且讓電腦愛按照特定順序進行任務讀取,從而實現預期的功能;
為了讓電腦能夠解讀此類檔案的內容並正確予以執行,必須將程式原始碼檔案轉換為電腦可以識別並使用的二進位格式,此轉換過程稱為編譯;而想要完成編譯過程,必須使用特定的編譯器工具;因此,無論使用何種程式設計語言進行程式編寫,都必須嚴格按照編譯器所能夠識別的特定格式和文法結構進行程式編寫;
程式設計語言:
進階語言:
根據原始碼的處理方式分類:
編譯型語言:
原始碼 --> 編譯器(編譯) --> [連結器(連結)--> ] 彙編器(彙編)-->可以執行的二進位代碼檔案;
解釋型語言:
原始碼 --> 解譯器(逐行解釋)-->邊解釋邊執行
根據編程過程中的功能實現是調用庫還是調用外部程式檔案:
完整程式設計語言:
利用庫或編程組件進行編程;
指令碼程式設計語言:
利用解譯器調用被選擇的外部應用程式;
由此可以看出shell指令碼並不是一個編程,只能調用外部應用程式。
根據程式的編寫規範分類:
過程式語言:比如C語言
程式 = 指令 + 資料
以指令為中心,圍繞指令的功能實現設計資料和資料結構,資料為指令服務:
演算法和指令的實現形式:
順序執行
選擇執行
迴圈執行
物件導向語言:比如C++,java等等
程式 = 演算法 + 資料結構
以資料和資料結構為中心,將資料執行個體化,圍繞資料的需求來部署演算法;
類(class):被執行個體化的資料
屬性(attribution):同一類中的不同對象的區分依據;
方法(method):類的正確的操作方法;
低級語言:
組合語言
機器語言:二進位語言
shell指令碼編程--bash指令碼編程:
過程式程式設計語言,解釋啟動並執行程式設計語言,指令碼類語言(依靠外部應用程式檔案運行)
shell指令碼到底是什嗎?
1.純文字文檔——檔案中所有儲存或包含的指令+資料都是以字元為單位進行儲存的;
2.根據使用者的需求來解決使用者問題的簡單或複雜的命令組合體;
3.是一種具有"執行等冪性"的程式實體:
執行等冪性:任何命令的一次執行結果和多次執行結果是一致的;
注意:
很多命令都不具備"執行等冪性",因此在shell指令碼中需要使用大量的程式邏輯來判斷某個命令會否符合其運行條件,從而避免在運行過程中出現的嚴重錯誤:
shell指令碼中的代碼內容如何書寫?
1.首行必須是shebang,即:解譯器程式的絕對路徑,必須佔據絕對行首且必修單獨佔據第一行。在執行指令碼時,會根據shebang的指示,啟動相應的解譯器以解釋指令碼內諸多的命令;(類似於c語言第一行#include<stdio.h>一樣)
#!/bin/bash
2.在shell指令碼中,除了shebang之外,所有行首為#字元的行,均被解釋為注釋行:即解譯器只會解釋其內容,但並不予以執行;(和C語言的//一樣)
3.解譯器會忽略指令檔中所有的空白行;指的是:在一行文本中,除了空白字元,空白字元,指標字元之外不具備其他任何字元的行;
4.大量的命令和關鍵字
命令:內部或外部應用程式
關鍵字:內建於shell,只能在某種特定結構體中執行的命令;keyword;
如:if,else,then,do,while,for,select,until,case,fi,esac,
5.shell中所有的特殊功能字元;
注意:所有被編寫進shell指令碼文檔的命令、關鍵字及符號必須是ASCII編碼格式的字元,其他編碼格式的字元可以出現在shell指令碼,但不具有任何特殊含義;
如何編寫shell指令碼?
可以利用所有的文字文件編輯工具進行shell指令碼編寫,如:
nano,vi,vim,pico,emacs,...
通常在linux的各髮型版本中,推薦使用vim;
指令檔的命名方式:
一般情況下,會為指令碼設定".sh"的名稱尾碼;較低版本的編輯工具,會根據檔案的尾碼名稱來識別是否為shell指令檔;較高版本的文本編輯工具,如vim7,無需過多的關心檔案尾碼名的問題。
指令碼的運行方式:
指令碼內容:
#!bin/bash
#
a="`egrep "^[[:space:]]*$" /etc/grub2.cfg | wc -l`"
b="`egrep "^[[:space:]]*$" /etc/issue | wc -l`"
let c=$a+$b
echo "$c"
1.為指令檔賦予執行許可權,可以直接以絕對路徑或相對路徑的方式運行此檔案:
# chmod +x /PATH/TO/SOME_SCRIPT_FILE
# /PATH/TO/SOME_SCRIPT_FILE
注意:如果指令檔所在目錄路徑儲存於PATH變數中,則直接以指令檔名來執行即可;
2.直接使用解譯器運行指令碼,將指令檔作為解譯器程式的參數;
# bash /PATH/TO/SOME_SCRIPT_FILE
bash命令的常用選項:
-x:使bash在解釋指令碼的過程展示在標準輸出上;一般用於shell指令碼排錯;
-n:對指令檔進行預執行,以分析指令碼中是否存在文法類錯誤;如果沒有錯誤,則不輸出任何資訊;相反,則輸出簡潔的提示資訊;具體的錯誤定位需要自行判斷;
注意:此種方式中,指令檔是否有執行許可權並不是很重要的屬性;
注意:以上兩種方式,在執行指令碼時,會在當前shell中開啟一個新的子shell以運行指令碼;一般情況下,當指令碼運行結束,該子shell也會被隨之銷毀;因此,所有在指令碼中定義的變數,在指令碼末尾處,最好將其明確的撤銷;unset gc
[root@localhost ~]# bash -x /tmp/test1.sh
++ egrep '^[[:space:]]*$' /etc/grub2.cfg
++ wc -l
+ a=17
++ egrep '^[[:space:]]*$' /etc/issue
++ wc -l
+ b=1
+ let c=17+1
+ echo 18
18
3.使用source命令運行指令碼:
# source /PATH/TO/SOME_SCRIPT_FILE
# . /PATH/TO/SOME_SCRIPT_FILE
[root@localhost ~]# source /tmp/test1.sh
18
[root@localhost ~]# . /tmp/test1.sh
18
注意:
1.source命令不會在運行指令碼時開啟子shell,而是在當前shell中運行;
2.使用source命令執行的指令碼中不要包括諸如exit類的命令;
聯絡:寫一個指令碼:
當Alex使用者不存在時,建立之;如果成功建立,則顯示成功建立的提示資訊,否則顯示使用者已存在;
#!/bin/bash
#
! id alex &> /dev/null && useradd alex && echo "cerat alex" || echo "no creat alex"
利用bash指令碼程式實現算術運算:
算術運算操作符:
常用的基本算術運算子:
+,-,*,/,%,**
增強型的算術運算子:
+=,-=,*=,/=,%=
特殊的增強型算術運算子:
++,--
算術運算方法:
1.$[expression]
其中的運算式可以是純數字組成的,也可以使用變數引用變數值;在使用變數時,可願意將$���號省略;
樣本:
# echo $[3+4]
# NUM 1=5;NUM2=4; echo $[NUM1+NUM2]
2.let VAR=EXPRESSION
根據算術運算式完成算術運算並賦值給指定變數;
3.$((EXPRESSION))
同1
4.expr ARGU1 ARGU2 ARGU3
其中ARGU1和ARGU3必須是整數數值;ARGU2是算術運算子。
5.echo "EXPRESSION" | bc
6.bc <<< "EXPRESSION"
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151485.htm