1. 程式人生 > >Shell程式設計三-Shell 基本運算子

Shell程式設計三-Shell 基本運算子

Shell 基本運算子

Shell 和其他程式語言一樣,支援多種運算子,包括:
1.算術運算子
2.關係運算符
3.布林運算子
4.邏輯運算子
5.字串運算子
6.檔案測試運算子

原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):
output=`expr 10 + 20`

兩點注意:
a.表示式和運算子之間要有空格,例如 10+20 是不對的,必須寫成 10 + 20,這與我們熟悉的大多數程式語言不
一樣。
b.完整的表示式要被 ` ` 包含,注意這個字元不是常用的單引號,在 Esc 鍵下邊。

一、算術運算子
例項:
#!/bin/bash
#--------------------------------------------
#name:practise14.sh
#author:wdh
#date:20181202
#--------------------------------------------

#算術運算子
echo "算數運算子:"
output=`expr 10 + 20`
echo "兩數之和為:$output"
output=`expr 10 - 20`
echo "兩數之差為:$output"
output=`expr 10 \* 20`
echo "兩數之積為:$output"
output=`expr 20 / 10`
echo "兩數之商為:$output"
output=`expr 10 % 20`
echo "取餘為:$output"
if [ 10 == 20 ];then
    echo "兩數相等"
else
    echo "兩數不相等"
fi
echo "-----------------------"
var_one=10
var_two=20
output=`expr $var_one + $var_two`
echo "兩數之和為:$output"
output=`expr $var_one - $var_two`
echo "兩數之差為:$output"
output=`expr $var_one \* $var_two`
echo "兩數之積為:$output"
output=`expr $var_two / $var_one`
echo "兩數之商為:$output"
output=`expr $var_two % $var_one`
echo "取餘為:$output"

#判斷兩個變數是否相等
if [ $var_one == $var_two ];then
    echo "兩數相等"
else
    echo "兩數不相等"
fi

#判斷兩個變數是否不相等
if [ $var_one != $var_two ];then
    echo "兩數不相等"
else
    echo "兩數相等"
fi

#變數賦值
var_one=$var_two

if [ $var_one == $var_two ];then
    echo "兩數相等"
else
    echo "兩數不相等"
fi

if [ $var_one != $var_two ];then
    echo "兩數不相等"
else
    echo "兩數相等"
fi

執行 ./practise14.sh
執行指令碼,結果如下:
算數運算子:
兩數之和為:30
兩數之差為:-10
兩數之積為:200
兩數之商為:2
取餘為:10
兩數不相等
-----------------------
兩數之和為:30
兩數之差為:-10
兩數之積為:200
兩數之商為:2
取餘為:0
兩數不相等
兩數不相等
兩數相等
兩數相等


二、關係運算符

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

例項:
#!/bin/bash
#--------------------------------------------
#name:practise15.sh
#author:wdh
#date:20181202
#--------------------------------------------

#關係運算符
echo "關係運算符:"
echo "-eq:檢測兩個數是否相等,相等返回 true。"
echo "-ne:檢測兩個數是否不相等,不相等返回 true。"
echo "-gt:檢測左邊的數是否大於右邊的,如果是,則返回 true。"
echo "-lt:檢測左邊的數是否小於右邊的,如果是,則返回 true。"
echo "-ge:檢測左邊的數是否大於等於右邊的,如果是,則返回 true。"
echo "-le:檢測左邊的數是否小於等於右邊的,如果是,則返回 true。"
echo "--------------------------------------------------------"
var_one=20
var_two=20
if [ $var_one -eq $var_two ];then
    echo "$var_one -eq $var_two :兩數相等"
else
    echo "$var_one -eq $var_two :兩數不相等"
fi

var_one=10
echo "--------------------------------------------------------"
if [ $var_one -ne $var_two ];then
    echo "$var_one -ne $var_two :兩數不相等"
else
    echo "$var_one -ne $var_two :兩數相等"
fi

var_one=30
echo "--------------------------------------------------------"
if [ $var_one -gt $var_two ];then
    echo "$var_one -gt $var_two :左邊大於右邊"
else
    echo "$var_one -gt $var_two :左邊不大於右邊"
fi

var_one=10
echo "--------------------------------------------------------"
if [ $var_one -lt $var_two ];then
    echo "$var_one -lt $var_two :左邊小於右邊"
else
    echo "$var_one -lt $var_two :左邊不小於右邊"
fi

var_one=30
echo "--------------------------------------------------------"
if [ $var_one -ge $var_two ];then
    echo "$var_one -ge $var_two :左邊大於等於右邊"
else
    echo "$var_one -ge $var_two :左邊小於右邊"
fi

var_one=20
echo "--------------------------------------------------------"
if [ $var_one -le $var_two ];then
    echo "$var_one -le $var_two :左邊小於等於右邊"
else
    echo "$var_one -le $var_two :左邊大於右邊"
fi

執行 ./practise15.sh
執行指令碼,結果如下:
關係運算符:
-eq:檢測兩個數是否相等,相等返回 true。
-ne:檢測兩個數是否不相等,不相等返回 true。
-gt:檢測左邊的數是否大於右邊的,如果是,則返回 true。
-lt:檢測左邊的數是否小於右邊的,如果是,則返回 true。
-ge:檢測左邊的數是否大於等於右邊的,如果是,則返回 true。
-le:檢測左邊的數是否小於等於右邊的,如果是,則返回 true。
--------------------------------------------------------
20 -eq 20 :兩數相等
--------------------------------------------------------
10 -ne 20 :兩數不相等
--------------------------------------------------------
30 -gt 20 :左邊大於右邊
--------------------------------------------------------
10 -lt 20 :左邊小於右邊
--------------------------------------------------------
30 -ge 20 :左邊大於等於右邊
--------------------------------------------------------
20 -le 20 :左邊小於等於右邊

三、布林運算子
例項:
#!/bin/bash
#--------------------------------------------
#name:practise16.sh
#author:wdh
#date:20181202
#--------------------------------------------

#布林運算子
echo "布林運算子:"
echo "! 非運算,表示式為 true 則返回 false,否則返回 true。"
echo "-o 或運算,有一個表示式為 true 則返回 true。"
echo "-a 與運算,兩個表示式都為 true 才返回 true。"

var_one=10
var_two=20
echo "--------------------------------------------------------"
if [ $var_one -eq $var_two ];then
    echo "$var_one -eq $var_two:結果為:true"
else
    echo "$var_one -eq $var_two:結果為:false"
fi

echo "--------------------------------------------------------"
if [ ! $var_one -eq $var_two ];then
    echo " ! $var_one -eq $var_two:結果為:true"
else
    echo " ! $var_one -eq $var_two:結果為:false"
fi

echo "--------------------------------------------------------"
if [ $var_one -gt 15  -o $var_two -gt 15 ];then
    echo "$var_one -gt 15 -o  $var_two -gt 15:結果為:true"
else
    echo "$var_one -gt 15 -o  $var_two -gt 15:結果為:false"
fi

echo "--------------------------------------------------------"
if [ $var_one -lt 30 -a  $var_two -lt 30 ];then
    echo "$var_one -lt 30 -a  $var_two -lt 30:結果為:true"
else
    echo "$var_one -lt 30 -a  $var_two -lt 30:結果為:false"
fi

執行 ./practise16.sh
執行指令碼,結果如下:
布林運算子:
! 非運算,表示式為 true 則返回 false,否則返回 true。
-o 或運算,有一個表示式為 true 則返回 true。
-a 與運算,兩個表示式都為 true 才返回 true。
--------------------------------------------------------
10 -eq 20:結果為:false
--------------------------------------------------------
 ! 10 -eq 20:結果為:true
--------------------------------------------------------
10 -gt 15 -o  20 -gt 15:結果為:true
--------------------------------------------------------
10 -lt 30 -a  20 -lt 30:結果為:true

四、邏輯運算子
例項:
#!/bin/bash
#--------------------------------------------
#name:practise17.sh
#author:wdh
#date:20181202
#--------------------------------------------

#邏輯運算子
echo "邏輯運算子:"
echo "&& 邏輯的 AND,表示式兩邊都為true,才為 true。"
echo "|| 邏輯的 OR,表示式兩邊有一個為true,則為 true。"

var_one=10
var_two=20
echo "--------------------------------------------------------"
if [[ $var_one -ge 15 && $var_two -ge 15 ]];then
    echo "$var_one -ge 15 && $var_two -ge 15:結果是:true"
else
    echo "$var_one -ge 15 && $var_two -ge 15:結果是:false"
fi

echo "--------------------------------------------------------"
if [[ $var_one -ge 15 || $var_two -ge 15 ]];then
    echo "$var_one -ge 15 || $var_two -ge 15:結果是:true"
else
    echo "$var_one -ge 15 || $var_two -ge 15:結果是:false"
fi

執行 ./practise17.sh
執行指令碼,結果如下:
邏輯運算子:
&& 邏輯的 AND,表示式兩邊都為true,才為 true。
|| 邏輯的 OR,表示式兩邊有一個為true,則為 true。
--------------------------------------------------------
10 -ge 15 && 20 -ge 15:結果是:false
--------------------------------------------------------
10 -ge 15 || 20 -ge 15:結果是:true


五、字串運算子
例項:
#!/bin/bash
#--------------------------------------------
#name:practise18.sh
#author:wdh
#date:20181202
#--------------------------------------------

#字串運算子
echo "字串運算子:"
echo "= 檢測兩個字串是否相等,相等返回 true。"
echo "!= 檢測兩個字串是否相等,不相等返回 true。"
echo "-z 檢測字串長度是否為0,為0返回 true。"
echo "-n 檢測字串長度是否為0,不為0返回 true。"
echo "str 檢測字串是否為空,不為空返回 true。"
var_one="Shell"
var_two="C++"

var_two="Shell"
echo "--------------------------------------------------------"
if [ $var_one = $var_two ];then
    echo "$var_one = $var_two:結果是:true"
else
    echo "$var_one = $var_two:結果是:false"
fi

var_two="C++"
echo "--------------------------------------------------------"
if [ $var_one != $var_two ];then
    echo "$var_one != $var_two:結果是:true"
else
    echo "$var_one != $var_two:結果是:false"
fi

var_three=""
echo "--------------------------------------------------------"
if [ -z $var_three ];then
#echo " -z $var_three:結果是:true"
    echo 'var_three是空串!'
else
    echo " -z $var_three:結果是:false"
fi

var_three="best"
echo "--------------------------------------------------------"
if [ -n $var_three ];then
    echo " -n $var_three:結果是:true"
else
    echo " -n $var_three:結果是:false"
fi

echo "--------------------------------------------------------"
if [ $var_three ];then
    echo " $var_three:結果是:true"
else
#echo " $var_three:結果是:false"
    echo 'var_three是空串!'
fi

var_three=""
echo "--------------------------------------------------------"
if [ $var_three ];then
    echo "$var_three:結果是:true"
else
#echo "$var_three:結果是:false"
    echo 'var_three是空串!'
fi

執行 ./practise18.sh
執行指令碼,結果如下:
字串運算子:
= 檢測兩個字串是否相等,相等返回 true。
!= 檢測兩個字串是否相等,不相等返回 true。
-z 檢測字串長度是否為0,為0返回 true。
-n 檢測字串長度是否為0,不為0返回 true。
str 檢測字串是否為空,不為空返回 true。
--------------------------------------------------------
Shell = Shell:結果是:true
--------------------------------------------------------
Shell != C++:結果是:true
--------------------------------------------------------
var_three是空串!
--------------------------------------------------------
 -n best:結果是:true
--------------------------------------------------------
 best:結果是:true
--------------------------------------------------------
var_three是空串!

六、檔案測試運算子
例項:

#!/bin/bash
#--------------------------------------------
#name:practise19.sh
#author:wdh
#date:20181202
#--------------------------------------------

#檔案測試運算子
echo "檔案測試運算子:"
echo "-b file:檢測檔案是否是塊裝置檔案,如果是,則返回 true。"
echo "-c file:檢測檔案是否是字元裝置檔案,如果是,則返回 true。"
echo "-d file:檢測檔案是否是目錄,如果是,則返回 true。"
echo "-f file:檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。"
echo "-g file:檢測檔案是否設定了 SGID 位,如果是,則返回 true。"
echo "-k file:檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。"
echo "-p file:檢測檔案是否是有名管道,如果是,則返回 true。"
echo "-u file:檢測檔案是否設定了 SUID 位,如果是,則返回 true。"
echo "-r file:檢測檔案是否可讀,如果是,則返回 true。"
echo "-w file:檢測檔案是否可寫,如果是,則返回 true。"
echo "-x file:檢測檔案是否可執行,如果是,則返回 true。"
echo "-s file:檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。"
echo "-e file:檢測檔案(包括目錄)是否存在,如果是,則返回 true。"

file="/home/wdh/test.sh"
echo "--------------------------------------------------------"
if [ -r $file ];then
    echo "檔案可讀"
else
    echo "檔案不可讀"
fi

echo "--------------------------------------------------------"
if [ -w $file ];then
    echo "檔案可寫"
else
    echo "檔案不可寫"
fi

echo "--------------------------------------------------------"
if [ -x $file ];then
    echo "檔案可執行"
else
    echo "檔案不可執行"
fi

echo "--------------------------------------------------------"
if [ -f $file ];then
    echo "檔案為普通檔案"
else
    echo "檔案為特殊檔案"
fi

echo "--------------------------------------------------------"
if [ -d $file ];then
    echo "檔案是個目錄"
else
    echo "檔案不是個目錄"
fi

echo "--------------------------------------------------------"
if [ -s $file ];then
    echo "檔案不為空"
else
    echo "檔案為空"
fi

echo "--------------------------------------------------------"
if [ -e $file ];then
    echo "檔案存在"
else
    echo "檔案不存在"
fi


執行 ./practise19.sh
執行指令碼,結果如下:
檔案測試運算子:
-b file:檢測檔案是否是塊裝置檔案,如果是,則返回 true。
-c file:檢測檔案是否是字元裝置檔案,如果是,則返回 true。
-d file:檢測檔案是否是目錄,如果是,則返回 true。
-f file:檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。
-g file:檢測檔案是否設定了 SGID 位,如果是,則返回 true。
-k file:檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。
-p file:檢測檔案是否是有名管道,如果是,則返回 true。
-u file:檢測檔案是否設定了 SUID 位,如果是,則返回 true。
-r file:檢測檔案是否可讀,如果是,則返回 true。
-w file:檢測檔案是否可寫,如果是,則返回 true。
-x file:檢測檔案是否可執行,如果是,則返回 true。
-s file:檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。
-e file:檢測檔案(包括目錄)是否存在,如果是,則返回 true。
--------------------------------------------------------
檔案可讀
--------------------------------------------------------
檔案可寫
--------------------------------------------------------
檔案可執行
--------------------------------------------------------
檔案為普通檔案
--------------------------------------------------------
檔案不是個目錄
--------------------------------------------------------
檔案不為空
--------------------------------------------------------
檔案存在