標籤:linux 變數 bashshell編輯
程式的主要組件:
1、變數 2、條件測試 3、語句:如:if、for、while、case
一、變數
變數是任何一門語言中的一個重要組成部分。定義變數就是在記憶體空間中開闢空間,使用該空間來儲存程式運行中的中間資料的。
既然是儲存資料的空間了,那麼開闢的記憶體空間應該有二個特點:
1、在記憶體中開闢的空間的大小。
聲明變數的類型,其實就決定了在記憶體中開闢的空間的大小了。
如:int var
這就決定了變數var,能夠儲存的資料長度為65535.在強型別的語言中,使用變數時必需要聲明變數的類型,再使用。該變數只能儲存指定的類型的資料。
如果該變數儲存的資料大於開闢的記憶體空間的話,就會溢出。也就是造成資料的丟失。這是在定義變數的時候要注意的。
Bashshell是弱類型的語言,使用變數儲存程式執行的中間資料不需要事先聲明就可以直接使用了。預設變數是字元類型的。
如:
引用命令的執行結果,給變數:freeMem賦值。
[[email protected] ~]# freeMem=$(free -m | awk ‘/^Mem/{print ($4+$6+$7)/$2}‘)
查看變數freeMem的值
[[email protected] ~]# echo $freeMem 0.883534
輸出變數freeMem加1的結果。
[[email protected] ~]# 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的變數預設是字元類型的。那麼怎麼對變數做運行算術運算呢?
做算術運算的條件:必需是數值型。
所以,在做算術運算之前要做變數類型的轉換。
例:
[[email protected] ~]# a=2[[email protected] ~]# b=3
做字元的串連
[[email protected] ~]# echo "$a$b"23
使用$[],告訴bashshell要對變數:$a、$b 做算術運算。bashshell在做算術運算之前就對這兩個變數的類型做隱式轉換,之後才做算術運算的。
[[email protected] ~]# echo "$[$a + $b]"5
說明:
對字元類型的變數:$a、$b做算術運算,要先進做資料類型轉換再做算術運算的。如果,我們明確知道這兩個變數記錄的資料是用來做算術運算的話,在使用變數之前最好聲明變數的類型,這避免了做資料類型轉換的過程。我們的程式執行是不是快一點呀?
還有一個好處,是節約記憶體空間:
把123當做數實值型別儲存的話:一個位元組8位就可以儲存數值型 123 把123當做字元儲存儲存的話:要三個位元組才可以儲存字元型 123
所以,我們如果明確知道變數的儲存類型的話,最好聲明該變數是用來儲存什麼類型的資料的。
如:
[[email protected] ~]# declare -i sum=0 [[email protected] ~]# let sum+=4 [[email protected] ~]# declare -p sum declare -i sum="4" [[email protected] ~]# echo $sum 4
三、bashshell的條件測試。
程式中有了判斷語句(if)、迴圈語句(for,until,while)、選擇語句(case),這些語句都可以互相嵌套使用,這就使得程式的邏輯功能非強強大,能類比很多人的行為,這就是自動化的實現。
但是它們的最核心是就是探測某一事物的“真/假”執行不同的行為(也就是這些做條件測試)。那麼,在 bashshell中:0 表示:真。非0,表示假。這與其它程式設計語言是相背的。
用到if、for、until、while,的前提是要先瞭解:如何做條件測試。:
1、字串的比較、匹配、判斷:
(1)、字串的判斷
-n string 字串不為空白得為真 -z string 字串為空白則為真
(2)、字串的比較
比較在ACIL碼錶當中,誰靠前誰靠後。
string1 == string2 比較兩字串是否相同 string1 > string2 比較字串string1是否在string2的前面。 string1 < string2
(3) 字串的匹配
string =~ PATTERN
2、數值的比較
整數比較測試:
-gt -----> 大於 Greater Than -ge -----> 大於等於 Greater or Equal -lt -----> 小於 Lesser Than -le -----> 小於等於 Lesser or Equal -eq -----> 等於 equal -ne -----> 不等於 Not Equal
3、檔案的判斷.
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 存在並且字元裝置則返回真
4、命令的執行狀況(成功與否)
# COMMAND# echo $? -------> 如果:$?為:0 的話。就代表上面的命令執行成功的。否則是執行失敗的。
指令碼是做條件測試使用的符號與命令:
條件測試的結果通常是布爾型的:真或假
1、test expression(運算式) 測試運算式是真不是假2、[ expression ] 注意:expression兩邊要有空格3、[[ expression ]]
注意單雙中括弧是有區別的:
一個中括弧類型於bash shell 的內建命令
兩個中括弧是bash shell的關鍵字。可以使用類型Regex來測試
如:
[[email protected] ~]# read -p "Plz enter varValue: " varPlz enter varValue: yes[[email protected] ~]# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok"ok[[email protected] ~]# read -p "Plz enter varValue: " varPlz enter varValue: Yes[[email protected] ~]# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok"ok
4、組合條件測試
組合條件測試:在多個條件間實現邏輯運算
(1)、與: [ conditionl -a condition2 ] 兩個為真才為真 或使用 condition1 && condition2 (2)、或: [ conditionl -o condition2 ] 只要一個為真則為真 condition1 || condition2
三、構造邏輯強大的程式
知道了bash shell 的條件測試,就可以使用:if、for、until、while、case 等語句互相嵌套,根據條件測試的真假和使用變數記錄程式運行過程中的資料,來構造邏輯性很強的程式了。
當然,我們要學會這些語句的使用。
1、if語句有三種格式:--------> 做”判斷“
(1)、單分支 if 語句
if 測試條件; then選擇分支if
注意:分號(;)是語句結束符。因為 then 是另一個語句。與 if 寫在一行。所以要使用分號。
(2)、雙分支的 if 語句.(兩個分支僅執行其中之一)
if 測試條件;then 選擇分支 else 選擇分支 if
(3)、多分支
if 條件1;then 分支1elif 條件2; then 分支2...else 分支nfi
2、for語句的格式
for VAR_NAME in LIST;do 迴圈體done
3、while適用於迴圈次數未知,或不便用for直接產生較大的列表時;
while 測試條件; do 迴圈體done
4、case ---------------> “做選擇”
case 變數引用 in PATTERN1) --------> 可以做字元比較或模式比對 選擇分支1 ;; PATTERN2) 選擇分支2 ;; ... *) 選擇分支n ;; esac
本文出自 “Linux” 部落格,請務必保留此出處http://9528du.blog.51cto.com/8979089/1534948