程序的主要部件:正則表達式
一、變量 二、條件測試 三、語句:如:if、for、while、case
1、變量shell
變量是任何一門語言中的一個重要組成部分。定義變量就是在內存空間中開闢空間,使用該空間來存儲程序運行中的中間數據的。express
既然是存儲數據的空間了,那麼開闢的內存空間應該有二個特色:編程
一、在內存中開闢的空間的大小。bash
聲明變量的類型,其實就決定了在內存中開闢的空間的大小了。編程語言
如:int varide
這就決定了變量var,可以存儲的數據長度爲65535.在強類型的語言中,使用變量時必須要聲明變量的類型,再使用。該變量只能存儲指定的類型的數據。函數
若是該變量存儲的數據大於開闢的內存空間的話,就會溢出。也就是形成數據的丟失。這是在定義變量的時候要注意的。測試
Bashshell是弱類型的語言,使用變量存儲程序執行的中間數據不須要事先聲明就能夠直接使用了。默認變量是字符類型的。spa
如:
引用命令的執行結果,給變量:freeMem賦值。
[root@stu13 ~]# freeMem=$(free -m | awk '/^Mem/{print ($4+$6+$7)/$2}')
查看變量freeMem的值
[root@stu13 ~]# echo $freeMem 0.883534
輸出變量freeMem加1的結果。
[root@stu13 ~]# echo "${freeMem} + 1" 0.883534 + 1
說明:
從結果中,能夠看出只是作字符的鏈接。因此,Bashshell的變量默認是字符類型的。
2、在內存中開闢的空間的存活時長。
這就是所謂:「程序中變星的做用範圍」。
全局變量(環境變量) 使用【export 】導出,任何shell都要以訪問。 本地變量 只對當前shell進程有效;對其它shell進程無效, 包括當前shell進程的子進程。 局部變量 對shell腳本中某代碼片段有效;使用【local】說明該變量變局部變量。 一般用於本地變量。
咱們知道了,變量的做用範圍以後,在程序的啥位置能夠引用到該變量的值。當咱們要使用到變量存儲程序的執行的中間數據的時候:
若是須要在程序的不一樣位置(主程序中、函數中)引用變量的話,就要把變量定義爲本地變量。若是,把該變量定義成局部變量的話,存儲的數據就會丟失了。
若是咱們在函數中使用到變量,且只在該函數體中引用該變量的話,就沒必要要把變量定義成本地變量了,應該把它變量設置爲:局部變量。只在函數體中有效。當主程序調用該函數完成以後,該變量所佔用的內存空間就被釋放了。不競內存是有限的。這也是程序優劣的一個體現。
testVar() { local pid base= user= nice= bg= pid_file= }
既然,bashshell的變量默認是字符類型的。那麼怎麼對變量作運行算術運算呢?
作算術運算的條件:必需是數值型。
因此,在作算術運算以前要作變量類型的轉換。
例:
[root@stu13 ~]# a=2 [root@stu13 ~]# b=3
作字符的鏈接
[root@stu13 ~]# echo "$a$b" 23
使用$[],告訴bashshell要對變量:$a、$b 作算術運算。bashshell在作算術運算以前就對這兩個變量的類型作隱式轉換,以後才作算術運算的。
[root@stu13 ~]# echo "$[$a + $b]" 5
說明:
對字符類型的變量:$a、$b作算術運算,要先進作數據類型轉換再作算術運算的。若是,咱們明確知道這兩個變量記錄的數據是用來作算術運算的話,在使用變量以前最好聲明變量的類型,這避免了作數據類型轉換的過程。咱們的程序執行是否是快一點呀?
還有一個好處,是節約內存空間:
把123當作數值類型存儲的話:一個字節8位就能夠存儲數值型 123 把123當作字符存儲存儲的話:要三個字節才能夠存儲字符型 123
因此,咱們若是明確知道變量的存儲類型的話,最好聲明該變量是用來存儲什麼類型的數據的。
如:
[root@stu13 ~]# declare -i sum=0 [root@stu13 ~]# let sum+=4 [root@stu13 ~]# declare -p sum declare -i sum="4" [root@stu13 ~]# echo $sum 4
3、bashshell的條件測試。
程序中有了判斷語句(if)、循環語句(for,until,while)、選擇語句(case),這些語句均可以互相嵌套使用,這就使得程序的邏輯功能非強強大,能模擬不少人的行爲,這就是自動化的實現。
可是它們的最核心是就是探測某一事物的「真/假」執行不一樣的行爲(也就是這些作條件測試)。那麼,在 bashshell中:0 表示:真。非0,表示假。這與其它編程語言是相背的。
用到if、for、until、while,的前提是要先了解:如何作條件測試。:
一、字符串的比較、匹配、判斷:
(1)、字符串的判斷
-n string 字符串不爲空得爲真 -z string 字符串爲空則爲真
(2)、字符串的比較
比較在ACIL碼錶當中,誰靠前誰靠後。
string1 == string2 比較兩字符串是否相同 string1 > string2 比較字符串string1是否在string2的前面。 string1 < string2
(3) 字符串的匹配
string =~ PATTERN
二、數值的比較
整數比較測試:
-gt -----> 大於 Greater Than -ge -----> 大於等於 Greater or Equal -lt -----> 小於 Lesser Than -le -----> 小於等於 Lesser or Equal -eq -----> 等於 equal -ne -----> 不等於 Not Equal
三、文件的判斷.
Linux有一個很重要的哲學思想:一切皆文件,因此bashshell也提供了很豐富的文件測試功能
-e FILE 測試一個目錄文件是否存在。 exists -f FILE 測試一個文件是不是普通文件 -d FILE 測試一個文件是否爲目錄 -h/-l FILE 測試一個文件是否爲符號鏈接 -r FILE 測試當前用戶是否對該文件有讀權限 -w FILE 測試當前用戶是否有寫權限 -x FILE 測試當前用戶是否有執行權限 -s FILE 測試一個文件是不是套接字文件且存在才返回真(0) -b FILE 測試一個文件是不是塊設備文件且存在才返回真 -c FILE 存在而且字符設備則返回真
四、命令的執行情況(成功與否)
# COMMAND # echo $? -------> 若是:$?爲:0 的話。就表明上面的命令執行成功的。不然是執行失敗的。
腳本是作條件測試使用的符號與命令:
條件測試的結果一般是布爾型的:真或假
一、test expression(表達式) 測試表達式是真不是假 二、[ expression ] 注意:expression兩邊要有空格 三、[[ expression ]]
注意單雙中括號是有區別的:
一箇中括號類型於bash shell 的內置命令
兩個中括號是bash shell的關鍵字。可使用類型正則表達式來測試
如:
[root@stu13 ~]# read -p "Plz enter varValue: " var Plz enter varValue: yes [root@stu13 ~]# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok" ok [root@stu13 ~]# read -p "Plz enter varValue: " var Plz enter varValue: Yes [root@stu13 ~]# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok" ok
四、組合條件測試
組合條件測試:在多個條件間實現邏輯運算
(1)、與: [ conditionl -a condition2 ] 兩個爲真才爲真 或使用 condition1 && condition2 (2)、或: [ conditionl -o condition2 ] 只要一個爲真則爲真 condition1 || condition2
3、構造邏輯強大的程序
知道了bash shell 的條件測試,就可使用:if、for、until、while、case 等語句互相嵌套,根據條件測試的真假和使用變量記錄程序運行過程當中的數據,來構造邏輯性很強的程序了。
固然,咱們要學會這些語句的使用。
一、if語句有三種格式:--------> 作」判斷「
(1)、單分支 if 語句
if 測試條件; then 選擇分支 if
注意:分號(;)是語句結束符。由於 then 是另外一個語句。與 if 寫在一行。因此要使用分號。
(2)、雙分支的 if 語句.(兩個分支僅執行其中之一)
if 測試條件;then 選擇分支 else 選擇分支 if
(3)、多分支
if 條件1;then 分支1 elif 條件2; then 分支2 ... else 分支n fi
二、for語句的格式
for VAR_NAME in LIST;do 循環體 done
三、while適用於循環次數未知,或不便用for直接生成較大的列表時;
while 測試條件; do 循環體 done
四、case ---------------> 「作選擇」
case 變量引用 in PATTERN1) --------> 能夠作字符比較或模式匹配 選擇分支1 ;; PATTERN2) 選擇分支2 ;; ... *) 選擇分支n ;; esac