3.1 條件表達式express
表達式數組 |
示例bash |
[ expression ] | [ 1 -eq 1 ] |
` expression ` | ` 1 -eq 1 ` |
test expression | test 1 -eq 1 ,等同於[] |
3.2 整數比較符less
比較符運維 |
描述ide |
示例測試 |
-eq,equal | 等於 | [ 1 -eq 1 ]爲true |
-ne,not equal | 不等於 | [ 1 -ne 1 ]爲false |
-gt,greater than | 大於 | [ 2 -gt 1 ]爲true |
-lt,lesser than | 小於 | [ 2 -lt 1 ]爲false |
-ge,greater or equal | 大於或等於 | [ 2 -gt 1 ]爲true |
-le,lesser or equal | 小於或等於 | [ 2 -le 1 ]爲false |
3.3 字符串比較符spa
運算符orm |
描述blog |
示例 |
== | 等於 | [ "a" == "a" ]爲true |
!= | 不等於 | [ "a" != "a" ]爲false |
> | 大於,判斷字符串時根據ASCII碼錶順序,不經常使用 | 在[]表達式中:[ 2 \> 1 ]爲true 在[[]]表達式中:[[ 2 > 1 ]]爲true 在(())表達式中:(( 3 > 2 ))爲true |
< | 小於,判斷字符串時根據ASCII碼錶順序,不經常使用 | 在[]表達式中:[ 2 \< 1 ]爲false 在[[]]表達式中:[[ 2 < 1 ]]爲false 在(())表達式中:(( 3 < 2 ))爲false |
>= | 大於等於 | 在(())表達式中:(( 3 >= 2 ))爲true |
<= | 小於等於 | 在(())表達式中:(( 3 <= 2 ))爲false |
-n | 字符串長度不等於0爲真 | VAR1=1;VAR2="" [ -n "$VAR1" ]爲true [ -n "$VAR2" ]爲false |
-z | 字符串長度等於0爲真 | VAR1=1;VAR2="" [ -z "$VAR1" ]爲false [ -z "$VAR2" ]爲true |
str | 字符串存在爲真 | VAR1=1;VAR2="" [ $VAR1 ]爲true [ $VAR2 ]爲false |
須要注意的是,使用-z或-n判斷字符串長度時,變量要加雙引號。
舉例說明:
# [ -z $a ] && echo yes || echo no yes # [ -n $a ] && echo yes || echo no yes # 加了雙引號才能正常判斷是否爲空 # [ -z "$a" ] && echo yes || echo no yes # [ -n "$a" ] && echo yes || echo no no # 使用了雙中括號就不用了雙引號 # [[ -n $a ]] && echo yes || echo no no # [[ -z $a ]] && echo yes || echo no yes
3.4 文件測試
測試符 |
描述 |
示例 |
-e | 文件或目錄存在爲真 | [ -e path ] path存在爲true |
-f | 文件存在爲真 | [ -f file_path ] 文件存在爲true |
-d | 目錄存在爲真 | [ -d dir_path ] 目錄存在爲true |
-r | 有讀權限爲真 | [ -r file_path ] file_path有讀權限爲true |
-w | 有寫權限爲真 | [ -w file_path ] file_path有寫權限爲true |
-x | 有執行權限爲真 | [ -x file_path ] file_path有執行權限爲true |
-s | 文件存在而且大小大於0爲真 | [ -s file_path ] file_path存在而且大小大於0爲true |
3.5 布爾運算符
運算符 |
描述 |
示例 |
! | 非關係,條件結果取反 | [ ! 1 -eq 2 ]爲true |
-a | 和關係,在[]表達式中使用 | [ 1 -eq 1 -a 2 -eq 2 ]爲true |
-o | 或關係,在[]表達式中使用 | [ 1 -eq 1 -o 2 -eq 1 ]爲true |
3.6 邏輯判斷符
判斷符 |
描述 |
示例 |
&& | 邏輯與,在[[]]和(())表達式中或判斷表達式是否爲真時使用 | [[ 1 -eq 1 && 2 -eq 2 ]]爲true (( 1 == 1 && 2 == 2 ))爲true [ 1 -eq 1 ] && echo yes 若是&&前面表達式爲true則執行後面的 |
|| | 邏輯或,在[[]]和(())表達式中或判斷表達式是否爲真時使用 | [[ 1 -eq 1 || 2 -eq 1 ]]爲true (( 1 == 1 || 2 == 2 ))爲true [ 1 -eq 2 ] || echo yes 若是||前面表達式爲false則執行後面的 |
3.7 整數運算
運算符 |
描述 |
+ | 加法 |
- | 減法 |
* | 乘法 |
/ | 除法 |
% | 取餘 |
運算表達式 |
示例 |
$(()) | $((1+1)) |
$[] | $[1+1] |
上面兩個都不支持浮點運算。
$(())表達式還有一個用途,三目運算:
# 若是條件爲真返回1,不然返回0 # echo $((1<0)) 0 # echo $((1>0)) 1 指定輸出數字: # echo $((1>0?1:2)) 1 # echo $((1<0?1:2)) 2
注意:不支持字符串輸出
除了Shell自己的算數運算表達式,還有幾個命令支持複雜的算數運算:
命令 |
描述 |
示例 |
let | 賦值並運算,支持++、-- | let VAR=(1+2)*3 ; echo $VAR x=10 ; y=5 let x++;echo $x 每執行一次x加1 let y--;echo $y 每執行一次y減1 let x+=2 每執行一次x加2 let x-=2 每執行一次x減2 |
expr | 乘法*須要加反斜槓轉義\* | expr 1 \* 2 運算符兩邊必須有空格 expr \( 1 + 2 \) \* 2 使用雙括號時要轉義 |
bc | 計算器,支持浮點運算、平方等 | bc自己就是一個計算器,可直接輸入命令,進入解釋器。 echo 1 + 2 |bc 將管道符前面標準輸出做爲bc的標準輸入 echo "1.2+2" |bc echo "10^10" |bc echo 'scale=2;10/3' |bc 用scale保留兩位小數點 |
博客地址:http://lizhenliang.blog.51cto.com
QQ羣:323779636 (Shell/Python運維開發羣)
因爲Shell不支持浮點數比較,能夠藉助bc來完成需求:
# echo "1.2 < 2" |bc 1 # echo "1.2 > 2" |bc 0 # echo "1.2 == 2.2" |bc 0 # echo "1.2 != 2.2" |bc 1 看出規律了嘛?運算若是爲真返回1,不然返回0,寫一個例子: # [ $(echo "2.2 > 2" |bc) -eq 1 ] && echo yes || echo no yes # [ $(echo "2.2 < 2" |bc) -eq 1 ] && echo yes || echo no no
expr還能夠對字符串操做:
獲取字符串長度: # expr length "string" 6 截取字符串: # expr substr "string" 4 6 ing 獲取字符在字符串中出現的位置: # expr index "string" str 1 # expr index "string" i 4 獲取字符串開始字符出現的長度: # expr match "string" s.* 6 # expr match "string" str 3
看到這裏,想想裏面所講的小括號、中括號的用途,是否是有點懵逼了。那咱們總結一下!
( ) | 用途1:在運算中,先計算小括號裏面的內容 用途2:數組 用途3:匹配分組 |
(( )) | 用途1:表達式,不支持-eq這類的運算符。不支持-a和-o,支持<=、>=、<、>這類比較符和&&、|| 用途2:C語言風格的for(())表達式 |
$( ) | 執行Shell命令,與反撇號等效 |
$(( )) | 用途1:簡單算數運算 用途2:支持三目運算符 $(( 表達式?數字:數字 )) |
[ ] | 條件表達式,裏面不支持邏輯判斷符 |
` ` | 條件表達式,裏面不支持-a和-o,不支持<=和>=比較符,支持-eq、<、>這類比較符。支持=~模式匹配,也能夠不用雙引號也不會影響原意,比[]更加通用 |
$[ ] | 簡單算數運算 |
{ } | 對逗號(,)和點點(...)起做用,好比touch {1,2}建立1和2文件,touch {1..3}建立一、2和3文件 |
${ } | 用途1:引用變量 用途2:字符串處理 |