今天我們來看看 shell 中的數學計算和引用。在 shell 中的計算方法有三種:1、expr;2、();3、let。下來我們來仔細的看看這三種數學計算:
1、第一種:expr
格式:expr 操作數1 操作符 操作數2
舉例:
① expr 1 + 2 TMP=$(expr 1 + 2)
② expr 1 + 4 / 3 TMP=$(expr 1 + 4 / 3)
由此我們可以看出在 expr 的數學計算中,它是不支持浮點數的計算的,另外在賦值變量的時候還有一種寫法。
③ expr 1 + 2 * 3(?)
我們看到在第一次執行的時候報語法錯誤,這是因爲在 bash 腳本中,* 被賦予0到任意一個字符,我們當做乘法運算時,必須得加上轉義符(\)才能進行正確的乘法計算。
那麼由此可以看出第一種數學計算的格式要求相對嚴格一點。
2、第二種:()
格式:$((操作數1 操作符 操作數2))
舉例:TMP=$((1 + 3))
我們可以看出第二種數學計算的格式相對來說要求較鬆。
3、第三種:let
格式:let "[變量][操作符] 操作數1 操作符 操作數2"
舉例:
① let "3+4"
② let "TMP=3+4"
我們看到第三種數學計算的格式要求鬆,而且計算靈活
那麼我們學習 shell 中的數學計算有什麼實際用途呢?下來我們就來看一個例子,一個簡單的腳本:
當 /tmp 目錄下文件佔用率達到 80% 時,對磁盤文件進行特定的清理,當達到設定值時對管理員發一封郵件報警。
實現步驟:
a> 使用 df 命令對 /tmp 目錄進行查看
b> 對磁盤佔用率進行計算
我們之前說過它是不支持浮點數計算的,因此我們先 *100 再進行相除操作。我們看到在進行除法操作之後它的佔用率不等於 13%,這是因爲它還有一部分空間是給 root 用戶使用的。
c> 判斷是否達到特定值,我們把之前的寫成一個腳本
#! /bin/bash df /tmp ABC=$(expr 5820284 \* 100 / 49410864) echo $ABC if [ $ABC -gt 10 ] then echo "Warning ..." fi
我們來看看結果
我們看到已經達到 10% 了。
d> 根據第三步的結果決定報警,並將它寫入到 /home/aston/test/warning.txt 文件中,再加上日期信息
#! /bin/bash df /tmp ABC=$(expr 5820284 \* 100 / 49410864) echo $ABC if [ $ABC -gt 10 ] then echo "$(date) Warning [Disk greater than 10%!!!]" >> /home/aston/test/warning.txt fi
我們來看看結果
我們此時已經實現報警的功能。
下來我們來看看 shell 中的引用。那麼什麼叫引用呢?引用便是對 shell 腳本、程序、終端命令、變量以及字符串等結果的反饋。引用的類型如下所示
"" 雙引號 | ` 反引號 |
'' 單引號 | \ 反斜線 |
那麼我們爲什麼要進行引用呢?引用的目的就是爲了防止不必要的誤會。
舉例:
① echo hello world * 與 echo "hello world *"
我們的本意是輸出 hello world *,可是在第一種情況下,我們不加 "",便導致了它將 * 命令解讀成輸出全部的文件了。
② echo "hello "world " welcome"
我們看到第一種與第二種的區別了,第二種由於雙引號沒加完,因此它執行的結果會和我們想象的不一樣。
1、雙引號:使用雙引號可引用除字符 $、`、\ 外的任意字符或字符串。
舉例:echo "%#$^ $hello world"
我們看到只輸出了 world,並沒有 hello。
2、單引號:它與雙引號類似,不同的是 shell 會忽略任何引用值。
3、反引號:它用於將系統命令的輸出到變量。
① echo `hello` (錯 ×)
② echo `date` (對 √)
4、反斜線:如果下一個字符有特殊含義,反斜線防止 shell 誤解其含義。
下述字符包含有特殊意義:& * + ^ $ ` " | ?
我們看到在 & 後面的時候,它是報錯了。因爲 & 表示由退出的含義,因此在它前面加 \ 則會讓 shell 忽略其特殊含義,以防止誤解。