第三章 Shell表達式與運算符

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:字符串處理

image.png

相關文章
相關標籤/搜索