shell 之 數學計算 &引用(三)

        今天我們來看看 shell 中的數學計算和引用。在 shell 中的計算方法有三種:1、expr;2、();3、let。下來我們來仔細的看看這三種數學計算:

        1、第一種:expr

            格式:expr 操作數1 操作符 操作數2

            舉例:

            ① expr 1 + 2      TMP=$(expr 1 + 2)

圖片.png

            ② expr 1 + 4 / 3   TMP=$(expr 1 + 4 / 3)

圖片.png

        由此我們可以看出在 expr 的數學計算中,它是不支持浮點數的計算的,另外在賦值變量的時候還有一種寫法。

            ③ expr 1 + 2 * 3(?)

圖片.png

        我們看到在第一次執行的時候報語法錯誤,這是因爲在 bash 腳本中,* 被賦予0到任意一個字符,我們當做乘法運算時,必須得加上轉義符(\)才能進行正確的乘法計算。

        那麼由此可以看出第一種數學計算的格式要求相對嚴格一點。

        2、第二種:()

            格式:$((操作數1 操作符 操作數2))

            舉例:TMP=$((1 +   3))

圖片.png

        我們可以看出第二種數學計算的格式相對來說要求較鬆。

        3、第三種:let

            格式:let "[變量][操作符] 操作數1 操作符 操作數2"

            舉例:

            ① let "3+4"

            ② let "TMP=3+4"

圖片.png

        我們看到第三種數學計算的格式要求鬆,而且計算靈活

        那麼我們學習 shell 中的數學計算有什麼實際用途呢?下來我們就來看一個例子,一個簡單的腳本:

        當 /tmp 目錄下文件佔用率達到 80% 時,對磁盤文件進行特定的清理,當達到設定值時對管理員發一封郵件報警。

        實現步驟:

        a> 使用 df 命令對 /tmp 目錄進行查看

圖片.png

        b> 對磁盤佔用率進行計算

圖片.png

        我們之前說過它是不支持浮點數計算的,因此我們先 *100 再進行相除操作。我們看到在進行除法操作之後它的佔用率不等於 13%,這是因爲它還有一部分空間是給 root 用戶使用的。

        c> 判斷是否達到特定值,我們把之前的寫成一個腳本

#! /bin/bash

df /tmp

ABC=$(expr 5820284 \* 100 / 49410864)

echo $ABC

if [ $ABC -gt 10 ]
then
    echo "Warning ..."
fi

        我們來看看結果

圖片.png

        我們看到已經達到 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

        我們來看看結果

圖片.png

        我們此時已經實現報警的功能。

        下來我們來看看 shell 中的引用。那麼什麼叫引用呢?引用便是對 shell 腳本、程序、終端命令、變量以及字符串等結果的反饋。引用的類型如下所示

"" 雙引號
`   反引號
''  單引號
\  反斜線

        那麼我們爲什麼要進行引用呢?引用的目的就是爲了防止不必要的誤會

        舉例:

        ① echo hello world * 與 echo "hello world *"

圖片.png

        我們的本意是輸出 hello world *,可是在第一種情況下,我們不加 "",便導致了它將 * 命令解讀成輸出全部的文件了。

        ② echo "hello "world "  welcome"

圖片.png

        我們看到第一種與第二種的區別了,第二種由於雙引號沒加完,因此它執行的結果會和我們想象的不一樣。

        1、雙引號:使用雙引號可引用除字符 $、`、\ 外的任意字符或字符串

        舉例:echo "%#$^ $hello world"

圖片.png

        我們看到只輸出了 world,並沒有 hello。

        2、單引號:它與雙引號類似,不同的是 shell 會忽略任何引用值。

圖片.png

        3、反引號:它用於將系統命令的輸出到變量。

        ① echo  `hello`  (錯 ×)

        ② echo `date`    (對 √)

圖片.png

        4、反斜線:如果下一個字符有特殊含義,反斜線防止 shell 誤解其含義。

        下述字符包含有特殊意義:& * + ^ $ ` " | ?

圖片.png

        我們看到在 & 後面的時候,它是報錯了。因爲 & 表示由退出的含義,因此在它前面加 \ 則會讓 shell 忽略其特殊含義,以防止誤解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章