Shell 基本運算子


有各種不同的運算子shell都支援。本教學是基於預設shell(Bourne),所以我們要涵蓋所有重要的Bourne Shell運算子。

有以下的運算子,我們將要討論的:

  • 算術運算子。

  • 關係運算子。

  • 布林運算子。

  • 字串運算子。

  • 檔案測試操作。

Bourne shell的最初並沒有任何機制來執行簡單的算術,但它使用外部程式,無論是awk或必須簡單的程式expr。

下面是簡單的例子,把兩個數相加:

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

這將產生以下結果:

Total value : 4

記下有以下幾點:

  • 運算子和表示式之間必須有空格,例如2+2是不正確的,因為它應該寫成2 + 2。

  • ``,稱為倒逗號之間應包含完整的表達。

算術運算子:

算術運算子有以下Bourne Shell支援。

假設變數a=10,變數b=20:

算術運算子例子

運算子 描述 例子
+ Addition - Adds values on either side of the operator `expr $a + $b` will give 30
- Subtraction - Subtracts right hand operand from left hand operand `expr $a - $b` will give -10
* Multiplication - Multiplies values on either side of the operator `expr $a * $b` will give 200
/ Division - Divides left hand operand by right hand operand `expr $b / $a` will give 2
% Modulus - Divides left hand operand by right hand operand and returns remainder `expr $b % $a` will give 0
= Assignment - Assign right operand in left operand a=$b would assign value of b into a
== Equality - Compares two numbers, if both are same then returns true. [ $a == $b ] would return false.
!= Not Equality - Compares two numbers, if both are different then returns true. [ $a != $b ] would return true.

這是非常重要的,這裡要注意,所有的條件式將放在方括號內,他們身邊有一個空格,例如 [ $a == $b ]是正確的,為[$a==$b] 是不正確的。

所有的算術計算,使用長整數。

關係運算子:

Bourne Shell的支援,關係運算子的具體數值。這些運算子不能使用字串值,除非它們的值是數位。

例如,運算子將努力檢查10和20之間的關係,以及在“10”和“20”,但不是“10”和“21”之間。

假設變數a=10,變數b=20:

關係運算子

運算子 描述 範例
-eq Checks if the value of two operands are equal or not, if yes then condition becomes true. [ $a -eq $b ] is not true.
-ne Checks if the value of two operands are equal or not, if values are not equal then condition becomes true. [ $a -ne $b ] is true.
-gt Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true. [ $a -gt $b ] is not true.
-lt Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true. [ $a -lt $b ] is true.
-ge Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true. [ $a -ge $b ] is not true.
-le Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true. [ $a -le $b ] is true.

這裡要注意,所有的條件式將放在方括號內,他們周圍有一個空格,這是非常重要的,例如 [ $a <= $b ]是正確的, [$a <= $b]是不正確的。

布林運算:

布林運算子有以下Bourne Shell的支援。

假設變數一個變數b=10,然後變數b=20:

布林運算範例

運算子 描述 範例
! This is logical negation. This inverts a true condition into false and vice versa. [ ! false ] is true.
-o This is logical OR. If one of the operands is true then condition would be true. [ $a -lt 20 -o $b -gt 100 ] is true.
-a This is logical AND. If both the operands are true then condition would be true otherwise it would be false. [ $a -lt 20 -a $b -gt 100 ] is false.

字串運算子:

有下列字串運算由Bourne Shell支援。

假設變數a=“abc”和變數b=“efg”:

關係運算例子

運算子 描述 例子
= Checks if the value of two operands are equal or not, if yes then condition becomes true. [ $a = $b ] is not true.
!= Checks if the value of two operands are equal or not, if values are not equal then condition becomes true. [ $a != $b ] is true.
-z Checks if the given string operand size is zero. If it is zero length then it returns true. [ -z $a ] is not true.
-n Checks if the given string operand size is non-zero. If it is non-zero length then it returns true. [ -z $a ] is not false.
str Check if str is not the empty string. If it is empty then it returns false. [ $a ] is not false.

檔案測試操作:

有以下是操作測試Unix檔案相關聯的各種屬性。

假設一個的變數檔案儲存現有檔案名“test”,其大小為100位元組,有讀,寫和執行許可權:

檔案測試操作例子

操作符 描述 範例
-b file Checks if file is a block special file if yes then condition becomes true. [ -b $file ] is false.
-c file Checks if file is a character special file if yes then condition becomes true. [ -b $file ] is false.
-d file Check if file is a directory if yes then condition becomes true. [ -d $file ] is not true.
-f file Check if file is an ordinary file as opposed to a directory or special file if yes then condition becomes true. [ -f $file ] is true.
-g file Checks if file has its set group ID (SGID) bit set if yes then condition becomes true. [ -g $file ] is false.
-k file Checks if file has its sticky bit set if yes then condition becomes true. [ -k $file ] is false.
-p file Checks if file is a named pipe if yes then condition becomes true. [ -p $file ] is false.
-t file Checks if file descriptor is open and associated with a terminal if yes then condition becomes true. [ -t $file ] is false.
-u file Checks if file has its set user id (SUID) bit set if yes then condition becomes true. [ -u $file ] is false.
-r file Checks if file is readable if yes then condition becomes true. [ -r $file ] is true.
-w file Check if file is writable if yes then condition becomes true. [ -w $file ] is true.
-x file Check if file is execute if yes then condition becomes true. [ -x $file ] is true.
-s file Check if file has size greater than 0 if yes then condition becomes true. [ -s $file ] is true.
-e file Check if file exists. Is true even if file is a directory but exists. [ -e $file ] is true.

C Shell 操作符:

以下連結將在C Shell運算子給出簡單的用法。

C Shell 運算子

Korn Shell 運算子:

以下連結將在Korn  Shell運算子給出簡單的用法

Korn Shell 運算子