說到編程,我們大家都不會陌生,但是在Linux中,我們主要做的是腳本的編寫。當然了,想要了解Linux的腳本編寫,我們得先來說說多命令執行的邏輯關係。
1.命令替換
COMMAND1 $(COMMAND2)
2.管道
COMMAND1 | COMMAND2 |...
3.順序執行結構
COMMAND1 ; COMMAND2 ;COMMAND3 ;....
4.選擇執行結構:
如果...那麼...
要麼...要麼...
主要的就是邏輯運算結構,我們大家所知的邏輯運算就是與或非,所以就從這三點來 說。
1)與:邏輯乘法,1--真,0--假,bash中,&&,雙目操作符
1 && 1=1
1 && 0=0
0 && 1=0
0 && 0=0
"與"運算的短路運算法則:只要第一個操作數爲flase;則其邏輯運算結果一定爲 false;
2)或:邏輯加法,1--真,0--假,bash中,||,雙目操作符
1 || 1=1
1 || 0=1
0 || 1=1
0 || 0=0
"或"運算短路法則:只要第一個操作數爲ture,則其邏輯運算結果一定爲ture;
3)非:邏輯取反,1--真,0--假,!,單目操作符;
!0=1
!1=0
命令的執行狀態返回值:
SUCCESS: 0--TURE
FAILURE: 1-255--FALSE
當然,在Linux中我們主要通過命令行輸入命令來對Linux系統進行操作的,所以,我 們主要是針對命令來實行與或非的邏輯運算。
與:COMMAND1 && COMMAND2
表示:
1.如果COMMADN1能夠成功執行,那麼將會執行COMMAND2;
2.如果COMMADN1執行失敗,那麼COMMAND2不會被執行;
或:COMMAND1 || COMMAND2
表示:
1.只有COMMAND1執行失敗,COMMAND2纔會被執行;
2.如果COMMADN1執行成功,那麼COMMAND2就不會被執行;
非:(一般與與或混合使用)
!COMMAND1 && COMMAND2 相當於 COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 相當於 COMMAND1 && COMMAND2
三種邏輯運算的優先級:
! > && > ||
示例:
如果用戶user4存在並且其家目錄也存在,那麼就執行userdel -r USer4命令;
id user4 && ls -d /home/user4 && userdel -r USer4
簡單介紹一下多命令執行的邏輯關係,我們來說說bash腳本編程。
什麼叫編程?
使用人類自然語言或機器語言進行程序源代碼書寫的過程。
爲什麼要編程?
爲了能夠讓用戶在使用計算機的時候,可以讓計算機以非交互的方式完成某些任務;此時用戶需要將此類任務編輯成爲一個文件,並且讓計算機按照特定的順序進行任務讀取,從而實現預期的功能;
爲了讓計算機能夠解讀此類文件的內容並正確的予以執行,必須將程序源代碼文件轉換爲計算機可以直接識別並使用的二進制格式,此轉換過程稱爲編譯;而想要完成編譯過程,必須使用特定的編譯器工具;因此無論使用何種編程語言進行程序編寫,都必須按照編譯器所能夠識別的特定格式和語法結構進行程序編寫;
我們至今所瞭解到的編程語言有:高級語言,低級語言以及機器語言。其中高級語言分居不同的方式有不同的分類:
1、根據源代碼的處理方式分類:
1)編譯性語言,主要過程:
源代碼 --> 編譯器處理(編譯) --> [鏈接器(鏈接)] --> 彙編器(彙編) --> 可執行的二進制代碼文件;
2)解釋性語言
源代碼 --> 解釋器(逐行解釋) --> 邊解釋邊執行。
2、根據在編程過程中的功能實現是調用庫還是調用外部程序文件來分類:
完整的編程語言:
利用庫或編程組件進行編程;
腳本編程語言:
利用解釋器調用被選擇的外部應用程序;
3、根據程序的編寫規範分類:
過程式語言:
程序 = 指令+數據
以指令爲中心,圍繞着指令的功能實現設計數據和數據結構,數據爲指令服務;
算法和指令的實現形式:
順序執行
選擇執行
循環執行
面嚮對象語言:
程序 = 算法+數據結構
以數據和數據結構爲中心,將數據實例化,圍繞數據的需求部署算法;
類(class):被實例化的數據;
屬性(atribution):同一類中的不同對象的區分依據;
方法(mathod):類的正確的操作方法;
低級語言主要是彙編語言,機器語言主要是二進制語言。而bash腳本編程語言是不同於這些編程語言的,它是一種過程式編程語言,解釋運行的編程語言,腳本類語言(依靠外部應用程序文件運行)。說了這麼多,那bash腳本到底是什麼呢?他到底如何編寫?它的代碼書寫格式到底與我們平常所使用的編程語言有什麼區別呢?接下來我們就來講一講。
一、bash腳本到底什麼?
1.純文本文檔——文件中所有存儲或包含的數據指令+數據都是以字符爲單位進行存儲的;
2.根據用戶的需求來解決用戶問題的簡單或複雜的命令組合體;
3.是一種具有"執行冪等性"的程序實體;
執行冪等性:任何命令的一次執行結果和多次執行結果是一致的;
注意:很多的命令都不具備"執行冪等性",因此在shell腳本中需要使用大量的程序邏輯來判斷某個命令是否符合其運行條件,從而避免在運行過程中出現的嚴重錯誤。
二、Shell腳本中的內容如何書寫?
1.首行必須是shebang,即:解釋器程序的絕對路徑,必須佔據絕對行首且必須單獨佔據第一行;在執行腳本時,會根據shebang的指示,啓動相應的解釋器以解釋腳本被諸多的命令;
#!/bin/bash
2.在shell腳本中,除了shebang之外,所有行首爲#字符的行,均被解釋爲註釋行;即:解釋器只會解釋其內容,但並不予以執行;
3.解釋器會忽略腳本文件中所有的空白行;空白行指的是:在一行文本中,除了空白字符,空格字符,製表字符不具備其他任何類型字符的行;
4.大量的命令和關鍵字
命令:內部或外部應用程序;
關鍵字:內置於shell,只能在某種特定結構體中執行的命令;keyword;
如:if,else,then,do,while,for,select,until,fi,esac,...
5.包含shell中的所有的特殊功能字符;
注意:所有被編寫進shell腳本文檔的命令、關鍵字及符號必須是ASCII編碼格式的字符;其他編碼格式的字符可以出現在shell腳本文件中,但不具有任何特殊含義;
三、如何編寫Shell腳本?
可以利用所有的文本文檔編輯工具來進行shell腳本編寫,如:nano,vi,vim,pico,emacs,...
通常在Linux的各發行版本中,推薦使用vim;
腳本文件的命令方式:
一般情況下,會爲腳本設置".sh"的名稱後綴;較低版本的編輯工具,會根據文件的後綴 名稱來識別是否爲shell腳本文件;較高版本的文本編輯工具,如vim7,可以忽略這樣的名 稱差異;無需過多的關心文件後綴名的問題。
我們瞭解了怎麼編寫,以及它的格式要求等一系列問題,那麼我們應該如何讓它運行起來呢?
腳本運行方式:
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垃圾收集。
3.使用source命令來運行腳本:
# source /PATH/TO/SOME_SCRIPT_FILE
# . /PATH/TO/OME_SCRIPT_FILE
注意:
1.source命令不會再運行腳本時開啓子shell,而是在當前shell中運行;
2.使用source命令執行的腳本中不要包括諸如exit類的命令;(很可能將當前shell注 銷,你設置的屬性等還得重新設置等)
寫一個腳本:
當alex用戶不存在時,創建之;如果成功創建,則顯示成功創建的提示信息,否則顯示用戶已存在。
[root@localhost ~]# vim a.sh #!/bin/bash # ! id alex && useradd alex && echo "User alex is here" || echo "alex is already." [root@localhost ~]# bash a.sh id: alex: no such user User alex is here
我們可以利用bash腳本程序實現算數運算:
算數運算操作符:
常用的基本算數運算符:
+,-,*,/,%,**
增強型的算數運算符:
+=,-=,*=,/=,%=
特殊的增強型算數運算符:
++,--
算術運算方法:
1.$[exipression]
其中的表達式可以是純數字組成的,也可以使用變量引用變量值;使用變量時,可以 將'$'符號省略;
示例:
# echo $[3+4]
# Num1=5;num2=4;echo $[Num1+num2]
2.let VAR=EXPRESSION
根據算數表達式完成算數運算並賦值給指定的變量;
3.$((EXPRESSION))
其中的表達式可以是純數字組成的,也可以使用變量引用變量值;使用變量時,可以 將'$'符號省略;
4.expr ARGUMENT1 ARGUMENT2 ARGUMENT3
其中ARGU1和ARGU3必須是整數數值;ARGU2是算數運算符;
5.echo "EXPRESSION" | bc
[root@localhost ~]# echo "scale=3;35/7" | bc 5.000
6.bc <<< "EXPRESSION"
[root@localhost ~]# bc <<< "scale=5;40/7" |bc 5.71428
例如:
[root@localhost ~]# vim a.sh #!/bin/bash # num1="`ls /etc | wc -l`" num2="`ls /var | wc -l`" num3="`ls /usr | wc -l`" let sum=$num1+$num2+$num3 echo "$sum" [root@localhost ~]# bash a.sh 310