Shell 表達(dá)式與運(yùn)算符

2022-01-18 16:12 更新


防偽碼:起床望明月,低頭思故鄉(xiāng)。

3 3 .1  條件表達(dá)式

表達(dá)式
實(shí)例
[ expression ] [ 1 -eq 1 ]
[[ expression ]] [[ 1 -eq 1 ]]
test expression test 1 -eq 1 ,等同于[]

3 3 .2  整數(shù)比較符

比較符描述示例
-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 -ge 1 ]為 true
-le,lesser or equal 小于或等于[ 2 -le 1 ]為 false

3 3 .3  字符串比較符

運(yùn)算符描述示例
== 等于[ "a" == "a" ]為 true
!= 不等于[ "a" != "a" ]為 false
>

大于,判斷字符串時(shí)根據(jù)

ASCII 碼表順序,不常用

在[]表達(dá)式中:[ 2 \> 1 ]為 true

在[[]]表達(dá)式中:[[ 2 > 1 ]]為 true

在(())表達(dá)式中:(( 3 > 2 ))為 true

<

小于,判斷字符串時(shí)根據(jù)

ASCII 碼表順序,不常用

在[]表達(dá)式中:[ 2 \< 1 ]為 false

在[[]]表達(dá)式中:[[ 2 < 1 ]]為 false

在(())表達(dá)式中:(( 3 < 2 ))為 false

>=大于等于 在(())表達(dá)式中:(( 3 >= 2 ))為 true
<= 小于等于在(())表達(dá)式中:(( 3 <= 2 ))為 false
-n  字符串長(zhǎng)度不等于 0 為真

VAR1=1;VAR2=""

[ -n "$VAR1" ]為 true

[ -n "$VAR2" ]為 false

-z 字符串長(zhǎng)度等于 0 為真 

VAR1=1;VAR2=""

[ -z "$VAR1" ]為 false

[ -z "$VAR2" ]為 true

str 字符串存在為真

VAR1=1;VAR2=""

[ $VAR1 ]為 true

[ $VAR2 ]為 false

需要注意的是,使用-z 或-n 判斷字符串長(zhǎng)度時(shí),變量要加雙引號(hào)。

舉例說(shuō)明:

# [ -z $a ] && echo yes || echo no

yes

# [ -n $a ] && echo yes || echo no

yes

# 加了雙引號(hào)才能正常判斷是否為空

# [ -z "$a" ] && echo yes || echo no

yes

# [ -n "$a" ] && echo yes || echo no

no

# 使用了雙中括號(hào)就不用了雙引號(hào)

# [[ -n $a ]] && echo yes || echo no

no

# [[ -z $a ]] && echo yes || echo no

yes

3 3 .4  文件測(cè)試

測(cè)試符描述示例
-e 文件或目錄存在為真 [ -e path ] path 存在為 true
-f 文件存在為真[ -f file_path ] 文件存在為 true
-d 目錄存在為真 [ -d dir_path ] 目錄存在為 true
-r 有讀權(quán)限為真[ -r file_path ] file_path 有讀權(quán)限為 true
-w  有寫(xiě)權(quán)限為真[ -w file_path ] file_path 有寫(xiě)權(quán)限為 true
-x 有執(zhí)行權(quán)限為真[ -x file_path ] file_path 有執(zhí)行權(quán)限為 true

-s

文件存在并且大小大于

0 為真

[ -s file_path ] file_path 存在并且大小大于 0

為 true

3 3 .5  布爾運(yùn)算符

運(yùn)算符描述示例
!  非關(guān)系,條件結(jié)果取反 [ ! 1 -eq 2 ]為 true
-a和關(guān)系,在[]表達(dá)式中使用 [ 1 -eq 1 -a 2 -eq 2 ]為 true
-o 或關(guān)系,在[]表達(dá)式中使用[ 1 -eq 1 -o 2 -eq 1 ]為 true

3 3 .6  邏輯判斷符

判斷符描述示例
&&

邏輯和,在[[]]和(())表達(dá)式中

或判斷表達(dá)式是否為真時(shí)使用

[[ 1 -eq 1 && 2 -eq 2 ]]為 true

(( 1 == 1 && 2 == 2 ))為 true

[ 1 -eq 1 ] && echo yes 如果&&前

面表達(dá)式為 true 則執(zhí)行后面的

||

邏輯或,在[[]]和(())表達(dá)式中

或判斷表達(dá)式是否為真時(shí)使用

[[ 1 -eq 1 || 2 -eq 1 ]]為 true

(( 1 == 1 || 2 == 2 ))為 true

[ 1 -eq 2 ] || echo yes 如果||前

面表達(dá)式為 false 則執(zhí)行后面的

3 3 .7  整數(shù)運(yùn)算

運(yùn)算符描述
+加法
-減法
*乘法
/除法
%取余

運(yùn)算表達(dá)式
示例
$(()) $((1+1))
$[] $[1+1]

上面兩個(gè)都不支持浮點(diǎn)運(yùn)算。

$(())表達(dá)式還有一個(gè)用途,三目運(yùn)算:

# 如果條件為真返回 1,否則返回 0

# echo $((1<0))

0

# echo $((1>0))

1

指定輸出數(shù)字:

# echo $((1>0?1:2))

1

# echo $((1<0?1:2))

2

注意:返回值不支持字符串

3 3 .8  其他運(yùn)算工具( let/ expr/bc )

除了 Shell 本身的算數(shù)運(yùn)算表達(dá)式,還有幾個(gè)命令支持復(fù)雜的算數(shù)運(yùn)算:

命令
描述示例
let賦值并運(yùn)算,支持++、--

let VAR=(1+2)*3 ; echo $VAR

x=10 ; y=5

let x++;echo $x 每執(zhí)行一次 x 加 1

let y--;echo $y 每執(zhí)行一次 y 減 1

let x+=2 每執(zhí)行一次 x 加 2

let x-=2 每執(zhí)行一次 x 減 2

expr乘法*需要加反斜杠轉(zhuǎn)義\*

expr 1 \* 2 運(yùn)算符兩邊必須有空格

expr \( 1 + 2 \) \* 2 使用雙括號(hào)時(shí)要轉(zhuǎn)義

bc

計(jì)算器,支持浮點(diǎn)運(yùn)算、

平方等

bc 本身就是一個(gè)計(jì)算器,可直接輸入命令,進(jìn)入解釋器。

echo 1 + 2 |bc 將管道符前面標(biāo)準(zhǔn)輸出作為 bc 的標(biāo)準(zhǔn)輸入

echo "1.2+2" |bc

echo "10^10" |bc

echo 'scale=2;10/3' |bc 用 scale 保留兩位小數(shù)點(diǎn)

由于 Shell 不支持浮點(diǎn)數(shù)比較,可以借助 bc 來(lái)完成需求:

# 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

看出規(guī)律了嘛?運(yùn)算如果為真返回 1,否則返回 0,寫(xiě)一個(gè)例子:

# [ $(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 還可以對(duì)字符串操作:

獲取字符串長(zhǎng)度:

# expr length "string"

6


截取字符串:

# expr substr "string" 4 6

ing

獲取字符在字符串中出現(xiàn)的位置:

# expr index "string" str

1

# expr index "string" i

4

獲取字符串開(kāi)始字符出現(xiàn)的長(zhǎng)度:

# expr match "string" str

3

3 3 .9 l Shell  括號(hào)用途總結(jié)

看到這里,想一想里面所講的小括號(hào)、中括號(hào)的用途,是不是有點(diǎn)懵逼了。那我們總結(jié)一下!




( )

用途 1:在運(yùn)算中,先計(jì)算小括號(hào)里面的內(nèi)容

用途 2:數(shù)組

用途 3:匹配分組

(( ))

用途 1:表達(dá)式,不支持-eq 這類的運(yùn)算符。不支持-a 和-o,支持<=、>=、<、>這類

比較符和&&、||

用途 2:C 語(yǔ)言風(fēng)格的 for(())表達(dá)式

$( )執(zhí)行 Shell 命令,與反撇號(hào)等效
$(( ))

用途 1:簡(jiǎn)單算數(shù)運(yùn)算

用途 2:支持三目運(yùn)算符 $(( 表達(dá)式?數(shù)字:數(shù)字 ))

[ ]條件表達(dá)式,里面不支持邏輯判斷符
[[ ]]

條件表達(dá)式,里面不支持-a 和-o,不支持<=和>=比較符,支持-eq、<、>這類比較

符。支持=~模式匹配,也可以不用雙引號(hào)也不會(huì)影響原意,比[]更加通用

$[ ] 簡(jiǎn)單算數(shù)運(yùn)算
{ }

對(duì)逗號(hào)(,)和點(diǎn)點(diǎn)(...)起作用,比如 touch {1,2}創(chuàng)建 1 和 2 文件,touch

{1..3}創(chuàng)建 1、2 和 3 文件

${ }

用途 1:引用變量

用途 2:字符串處理



本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)