shell指令碼從入門到複雜 其五 基本運算子

2021-08-19 20:28:44 字數 3387 閱讀 8259

shell支援多種運算子,包括:

算數運算子

關係運算子

布林運算子

字串運算子

檔案測試運算子

原生bash不支援簡單的數**算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。

expr 是一款表示式計算工具,使用它能完成表示式的求值操作。

例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):

# vi test.sh

#!/bin/bash

sum=`expr 1 + 3`

echo "兩數之和:$sum"

輸出:# sh test.sh

兩數之和:4

注意:表示式和運算子之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式語言不一樣。

完整的表示式要被 ` ` 包含,注意這個字元不是常用的單引號,在 esc 鍵下邊。

算術運算子

下表列出了常用的算術運算子,假定變數 a 為 10,變數 b 為 20:

運算子說明舉例+

加法`expr $a + $b` 結果為 30-減法

`expr $a - $b` 結果為 -10

*乘法 

`expr $a \* $b` 結果為  200/除法

`expr $b / $a` 結果為 2%取餘

`expr $b % $a` 結果為 0=賦值

a=$b 將把變數 b 的值賦給 a

==相等。用於比較兩個數字,相同則返回 true

[ $a == $b ] 返回 false

!=相等。用於比較兩個數字,不相同則返回 true

[ $a != $b ] 返回 true

注意:條件表示式要放在方括號之間,並且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。

乘號(*)前邊必須加反斜槓(\)才能實現乘法運算。

關係運算子

關係運算子只支援數字,不支援字串,除非字串的值是數字。

下表列出了常用的關係運算子,假定變數 a 為 10,變數 b 為 20:

運算子說明

舉例-eq

檢測兩個數是否相等,相等返回 true

[ $a -eq $b ] 返回 false

-ne檢測兩個數是否不相等,不相等返回 true

[ $a -ne $b ] 返回 true

-gt檢測左邊的數是否大於右邊的,如果是,則返回 true

[ $a -gt $b ] 返回 false

-lt檢測左邊的數是否小於右邊的,如果是,則返回 true

[ $a -lt $b ] 返回 true

-ge檢測左邊的數是否大於等於右邊的,如果是,則返回 true

[ $a -ge $b ] 返回 false

-le檢測左邊的數是否小於等於右邊的,如果是,則返回 true

[ $a -le $b ] 返回 true

布林運算子

下表列出了常用的布林運算子,假定變數 a 為 10,變數 b 為 20:

運算子說明舉例

! 非運算,表示式為 true 則返回 false,否則返回 true。[ ! false ] 返回 true

-o 或運算,有乙個表示式為 true 則返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true

-a與運算,兩個表示式都為 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false

邏輯運算子

以下介紹 shell 的邏輯運算子,假定變數 a 為 10,變數 b 為 20:

運算子說明舉例

&&       邏輯的 and[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||       邏輯的 or[[ $a -lt 100 || $b -gt 100 ]] 返回 true

字串運算子

下表列出了常用的字串運算子,假定變數 a 為 "abc",變數 b 為 "efg":

運算子說明舉例

= 檢測兩個字串是否相等,相等返回 true。[ $a = $b ] 返回 false

!=檢測兩個字串是否相等,不相等返回 true。[ $a != $b ] 返回 true

-z檢測字串長度是否為0,為0返回 true。[ -z $a ] 返回 false

-n 檢測字串長度是否為0,不為0返回 true。[ -n $a ] 返回 true

str檢測字串是否為空,不為空返回 true。[ $a ] 返回 true

檔案測試運算子

檔案測試運算子用於檢測 unix 檔案的各種屬性。

屬性檢測描述如下:

操作符說明

舉例-b file

檢測檔案是否是塊裝置檔案,如果是,則返回 true

[ -b $file ] 返回 false

-c file

檢測檔案是否是字元裝置檔案,如果是,則返回 true

[ -c $file ] 返回 false

-d file

檢測檔案是否是目錄,如果是,則返回 true

[ -d $file ] 返回 false

-f file 

檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true

[ -f $file ] 返回 true

-g file

檢測檔案是否設定了 sgid 位,如果是,則返回 true

[ -g $file ] 返回 false

-k file

檢測檔案是否設定了粘著位(sticky bit),如果是,則返回 true

[ -k $file ] 返回 false

-p file

檢測檔案是否是有名管道,如果是,則返回 true

[ -p $file ] 返回 false

-u file

檢測檔案是否設定了 suid 位,如果是,則返回 true

[ -u $file ] 返回 false

-r file

檢測檔案是否可讀,如果是,則返回 true

[ -r $file ] 返回 true

-w file

檢測檔案是否可寫,如果是,則返回 true

[ -w $file ] 返回 true

-x file

檢測檔案是否可執行,如果是,則返回 true

[ -x $file ] 返回 true

-s file

檢測檔案是否為空(檔案大小是否大於0),不為空返回 true

[ -s $file ] 返回 true

-e file

檢測檔案(包括目錄)是否存在,如果是,則返回 true

[ -e $file ] 返回 true

shell指令碼從入門到複雜 其四 陣列

陣列中可以存放多個值。bash shell 只支援一維陣列 不支援多維陣列 陣列元素的下標從0開始。shell 陣列用括號來表示,元素用 空格 符號分割開,語法格式如下 array name value1 valuen 讀取陣列 vi test.sh bin bash array1 a b c d ...

shell指令碼之從入門到放棄

批處理 預定義變數 用途 當前程序的程序號 pid 最後一次執行的命令的返回狀態。如果這個變數的值為 0,則證明上一條命令正確執行 如果這 個變數的值為非 0 具體是哪個數由命令自己來決定 則證明上一條命令執行錯誤 1後台執行的最後乙個程序的程序號 pid 備註 for,while,until三個大...

shell指令碼從入門到複雜 其一 第乙個指令碼

第乙個shell指令碼 vi test.sh 新增下面內容 bin bash echo hello world 是乙個約定的標記,告訴系統指令碼需要什麼直譯器來執行,就是使用哪一種 shell。echo 命令用於向視窗輸出文字。執行指令碼有兩種方式 1 作為可執行指令碼 這種方式需要賦予指令碼可執行...