1. 程式人生 > 其它 >Shell:算術運算子

Shell:算術運算子

expr命令

expr 是 evaluate expressions 的縮寫,譯為“表示式求值”。Shell expr 是一個功能強大,並且比較複雜的命令,它除了可以實現整數計算,還可以結合一些選項對字串進行處理,例如計算字串長度、字串比較、字串匹配、字串提取等

語法

計算語法

expr 算術運算子表示式

注意: 運算表示式

獲取計算結果賦值給新變數語法

result=`expr 算術運算子表示式`

算術運算子

算術運算子介紹

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

運算子 說明 舉例
+ 加法 expr $a + $b 結果為 3
- 減法 expr $a - $b 結果為 -1
* 乘法 expr $a \* $b 結果為 2
/ 除法 expr $b / $a 結果為 2
% 取餘 expr $b % $a 結果為 0
= 賦值 a=$b 將把變數 b 的值賦給 a

四則運算中如果使用了(), 也需要轉義 \( 1 + 1 \)

測試:

#!/bin/bash
a=1 b=2          # 宣告變數a=1和b=2
echo "a=${a} b=${b}"
echo "a + b = `expr $a + $b`"
echo "a * b = `expr $a \* $b`"
echo "a - b = `expr $a - $b`"
echo "a * b = `expr $a \* $b`"
echo "b / a = `expr $b / $a`"
echo "b % a = `expr $b % $a`"

echo -n "a == b 結果為 "
if [ $a == $b ]       # 注意變數與符號之間都要有空格
then
        echo true
else
        echo false
fi

echo -n "a != b 結果為 "
if [ $a != $b ]        # 注意變數與符號之間都要有空格
then
        echo true
else
        echo false
fi

比較運算子

整數比較運算子

下表列出了常用的比較運算子,假定變數 a 為 1,變數 b 為 2:

運算子 說明 舉例
-eq equals 檢測兩個數是否相等,相等返回 0, 否則返回1。 [ $a -eq $b ] 返回 1。
-ne not equals檢測兩個數是否不相等,不相等返回 0。 [ $a -ne $b ] 返回 0。
-gt greater than檢測左邊的數是否大於右邊的,
是返回0, 否則1
[ $a -gt $b ] 返回 1。
-lt lower than檢測左邊的數是否小於右邊的,
是返回0, 否則1
[ $a -lt $b ] 返回 0。
-ge
greater equals檢測左邊的數是否大於等於右邊的,
是返回0, 否則1
[ $a -ge $b ] 返回 1。
-le lower equals檢測左邊的數是否小於等於右邊的,
是返回0, 否則1
[ $a -le $b ] 返回 0。
< 檢測左邊的數是否小於右邊的,
是返回0, 否則1
(($a<$b)) 返回0
<= 檢測左邊的數是否小於等於右邊的,
是返回0, 否則1
(($a<=$b)) 返回0
> 檢測左邊的數是否大於右邊的,
是返回0, 否則1
(($a>$b)) 返回1
>= 檢測左邊的數是否大於等於右邊的,
是返回0, 否則1
(($a>=$b)) 返回1

注意: 整數比較運算子只支援整數,不支援小數與字串,除非字串的值是整數數字。

每個命令都有返回值, 返回0代表成功, 返回1代表失敗

字串比較運算子

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

字串比較可以使用 [[]][] 2種方式

運算子 說明 舉例
== 或 = 相等。用於比較兩個字串或數字,相同則返回 0。可以使用= [ $a == $b ] 返回1
[ $a = $b ] 返回 1
[[ $a == $b ]] 返回1
[[ $a = $b ]] 返回1
!= 不相等。用於比較兩個字串或數字,不相同則返回 0。 [ $a != $b ] 返回 0
[[ $a != $b ]] 返回 0
< 小於, 用於比較兩個字串或數字, 小於返回0, 否則返回1 [ $a \< $b ] 返回 0
[[ $a < $b ]] 返回 0
> 大於, 用於比較兩個字串或數字, 大於返回0, 否則返回1 [ $a \> $b ] 返回 1
[[ $a > $b ]] 返回 1
-z 檢測字串長度是否為0,為0返回 true。 [ -z $a ] 返回 1。
-n 檢測字串長度是否不為 0,不為 0 返回 true。 [ -n "$a" ] 返回 0。
$ 檢測字串是否不為空,不為空返回 0 ,否則返回1。 [ $a ] 返回 0。

字串比較沒有 <= 可以通過 [[ "a" < "b" && "a" = "b" ]]

[[]][] 的區別

1.[]會將含有空格字串進行分拆分割後比較

2.轉義字元

[[]]< 不需要轉義, 格式為 [[ 字串1 < 字串2 ]]

[] 需要對 <,>等 轉義 , 格式為 [ 字串1 \< 字串2 ]

[] 執行效果:

[[]]執行效果:

邏輯運算子

運算子 說明 舉例
&& 邏輯的 AND [[ 表示式1 && 表示式2 ]] 返回 false
|| 邏輯的 OR [[ 表示式1 || 表示式2 ]] 返回 true

注意: 使用&&|| 的運算子必須放在 [[]](())中才有效, 否則報錯

-a-o 的運算子必須放在 [] 在才有效 或 test命令中

!可以用在[],[[]]中, 不可以在(())

檔案測試運算子

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

屬性檢測描述如下:

操作符 說明 舉例
-b file 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file directory, 檢測檔案是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 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 read,檢測檔案是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file write,檢測檔案是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file execute, 檢測檔案是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file size, 檢測檔案是否為空(檔案大小是否大於0)
,不為空返回 true。
[ -s $file ] 返回 true。
-e file exists, 檢測檔案(包括目錄)是否存在,如果是,
則返回 true。
[ -e $file ] 返回 true。
file1 -nt file2 new than(nt), file1是否比file2新 [ file1 -nt file2 ]
file1 -ot file2 old than(ot), file1是否比file2舊 [ file1 -ot file2 ]

其他檢查符:

  • -S: 判斷某檔案是否 socket。
  • -L: link, 檢測檔案是否存在並且是一個符號連結。

語法

[ options 檔案路徑字串]

[[ options 檔案路徑字串 ]]