Linux Shell之運算式__Linux

來源:互聯網
上載者:User

嚴格來說,shell中沒有運算式的概念。Shell本身其實只是一堆命令的集合,當然也不是胡亂的堆在一起,而是有一定的組織。只是這個組織不那麼嚴謹,所以本文不是要真的總結所謂的運算式,而是把shell中一些犄角旮旯的東西拼湊在一起,實在不知道它們屬於那個分類。。 命令代換
其實就是這篇文章中的反引號所起的作用。但是命令代換還有另一種形式,如下:

m@meng:~/scripts$ m=`date`m@meng:~/scripts$ echo $m2015年 06月 25日 星期四 10:40:24 CSTm@meng:~/scripts$ n=$(date)m@meng:~/scripts$ echo $n2015年 06月 25日 星期四 10:40:37 CST

也就是說,`command`和$(command)的效果是一樣的。 算術代換
前面說過,將一個變數聲明為整數類型時,它就可以做算術運算,或者說,賦值給這個變數的數字不再被當成字串,而是真正的數字。如果沒有這個整數聲明,那麼把一個數字或算術運算式賦值給一個變數時,它的值仍被視為一般字元串。
但是現在,有另一個方法可以達到這個效果,就是符號$((expr))。處於內括弧中的變數將直接被視為整數,而不必事先聲明其為整數類型。如下:

m@meng:~/scripts$ r=3+4m@meng:~/scripts$ echo $r3+4m@meng:~/scripts$ echo $(($r))7m@meng:~/scripts$ echo $(($r+3))10

不過,$(()) 中只能用+-*/和()運算子,並且只能做整數運算。 引號
Shell指令碼中的單引號和雙引號一樣都是字串的界定符,兩者的區別在於,單引號中的所有字元都被視為一般字元,而捨棄其功能含義。比如’$’是變數值提取符,但是放在單引號中就是’\$’的字面值,如下:

m@meng:~/scripts$ q=5m@meng:~/scripts$ echo "$q"5m@meng:~/scripts$ echo '$q'$q

所以,在單引號中使用變數一定要小心。
所謂界定符,其實就是將界定符內的字串視為一個整體,而不會被空格等分隔字元打斷。
在雙引號內,所有的特殊字元將保持其轉義含義,如上面的’$’。如果想讓雙引號中的某個特殊字元恢複其本來面目,即取其字面值,可以在它前面添加逸出字元’\’,如下:

m@meng:~/scripts$ echo "\$q"$q
退出狀態
在shell中,可以認為一條命令就是一個運算式。運算式都是有值的,而一條命令的值是什麼呢。是它的執行結果嗎。比如ls列出來的檔案。實際上,可以把命令的出口狀態視為“命令運算式”的值:命令執行完畢後,會有一個出口狀態來表示這條命令是否執行成功,一般情況下,shell中命令執行成功出口狀態為0;失敗為1或其他非0值。可以使用系統變數“#?”來查詢上一條命令的出口狀態,如:
m@meng:~/scripts$ grep m new m@meng:~/scripts$ echo $?1m@meng:~/scripts$ cat new 的m@meng:~/scripts$ echo $?0m@meng:~/scripts$ m=4m@meng:~/scripts$ echo $?0

上例,grep命令在new檔案中沒有找到字元”m”,所以其出口狀態為1;其他都為0,包括指派陳述式。
退出狀態經常用做if語句的判斷條件。

test運算式
雖然可以直接使用命令的出口狀態作為if、while等語句的判斷條件,但是更常使用的卻是test等專門的測試命令。
test命令的文法為:
test 運算式
test主要用來執行三類測試:檔案屬性、數值比較、字串比較。如果測試結果為真,則該命令的Exit Status為0,如果測試結果為假,則命令的Exit Status為1。

檔案測試
格式為: test options file。主要的options包括: -e 測試file的存在性,若存在則值為0;否則為1。這個結果跟執行普通命令得到的出口狀態是一致的。 -d 測試file是否為目錄,是為0;否為1。 -f 若file是普通檔案,結果為真(即,值為0). -s 測試檔案是否為非空,若file存在且非空,為0;否則,即不存在或者是空檔案,為1。 -r file存在且唯讀,為真。 -w file存在且可寫,為真。 -x file存在且可執行,為真。

數字測試
數字測試的比較子竟然使用的是文字,對比如下(左側是C語言使用的傳統的運算子,右側是shell使用的):
== : -eq
!= : -ne
> : -gt
\< : -lt
>= : -ge
\<= : -le

字串測試
-z str: 若str的長度是0,結果為真(謹記:真 <==> $? == 0)
-n str: 若str的長度不是0,結果為真
s1 = s2 : 兩個字串相等,結果為真
s1 != s2 : 兩個字串不等,結果為真
str : 不加任何選項來測試str,效果同-n

[ ] 運算式
實際上,只有 [ 是命令,而 ] 只是界定符。[ 命令與test命令基本相同,唯一的區別就是格式不同,[ 命令需要將要測試的運算式置於括弧中,###且運算式左右兩邊分別要和[ ]留一個空格###,如[ -z “empty” ]。據說,[ 命令的效率稍微高一些,我沒驗證過。
還有一點:###[ 命令不支援運算子“>”和“<”###,所以對於字串比較運算的支援可能差一點,這是唯二的區別。。。。

[[ ]]運算式
擴充了[ ]命令,首先就是支援了運算子“>”和“<”,另外還支援邏輯運算&&,||,!,如下:

m@meng:~/scripts$ [ er > et ]m@meng:~/scripts$ echo $?0m@meng:~/scripts$ [[ er > et ]]m@meng:~/scripts$ echo $?1

顯然,er > et結果應該為假,所以測試運算式的出口狀態是1。但是[]沒有效果,而[[ ]]測試正確。

m@meng:~/scripts$ [ er > et || er < et ]bash: [: 缺少 `]`er:未找到命令m@meng:~/scripts$ [[ er > et || er < et ]]m@meng:~/scripts$ echo $?0m@meng:~/scripts$ [[ er > et && er < et ]]m@meng:~/scripts$ echo $?1
算術運算式
(( ))運算式
似乎有點淩亂了,(( ))與$(( ))的區別在於,後者可以把計算結果提取出來作為一個值使用,我個人感覺,’$’這個符號就是用來提取值的,比如引用變數的時候也用它。而符號(( ))只是完成計算本身,至於儲存結果,雖然也可以,但是不是主業。還是直接看命令吧:
m@meng:~/scripts$ ((m=4-2))m@meng:~/scripts$ echo $m2m@meng:~/scripts$ m=$((4-2))m@meng:~/scripts$ echo $m2

這意味著,((m=4-2))和m=$((4-2))效果是一樣的,也就是說在(())內部可以直接完成賦值。
~~~~

m@meng:~/scripts$ echo $((4-2))2m@meng:~/scripts$ echo ((4-2))bash: 未預期的符號 '(' 附近有語法錯誤

這說明,(())不負責儲存結果,想要結果的話,用’$’來提取。
~~~~

m@meng:~/scripts$ m=3;n=2m@meng:~/scripts$ echo $((m-n))1

這說明,在(())內部使用變數時,不需要添加’$’符號。
~~~~

m@meng:~/scripts$ m=3;n=2m@meng:~/scripts$ echo $((m<n))0m@meng:~/scripts$ echo $((m>n))1

顯然,(())還支援比較運算,唯一的問題是,它的出口狀態與test等其他命令恰好相反。
~~~~
總結一下這個運算式:
1、只支援整數運算;
2、支援的運算包括:=(賦值)、==(相等)、>= <= < > % + - * / -= += /= *= %=,很豐富了。 let運算式
與上面那個基本一樣,只是格式不同罷了,let中運算式寫在let後面,而不是括弧中。另外,由於不像(())有天然的界定符,所以算式中有空格時,需要用引號括起來。 expr運算式
以後再寫吧,好累。。。上面的已經夠用了。

邏輯運算
主要有&&、||、-a、-o、!和(),用來計算運算式之間的邏輯運算,支援用括弧()來進行組合,邏輯運算子和運算式之間要有空格
[[]]命令只支援符號,不支援-a和-o選項。

m@meng:~/scripts$ [[ er > et -o er < et ]]bash: 條件運算式中有語法錯誤bash: '-o' 附近有語法錯誤

完。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.