1. 程式人生 > >初步shell腳本編程

初步shell腳本編程

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"

初步shell腳本編程