防偽碼:起床望明月,低頭思故鄉(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)載!
更多建議: