您好,登錄后才能下訂單哦!
今天我們來看看 shell 中的數(shù)學(xué)計算和引用。在 shell 中的計算方法有三種:1、expr;2、();3、let。下來我們來仔細的看看這三種數(shù)學(xué)計算:
1、第一種:expr
格式:expr 操作數(shù)1 操作符 操作數(shù)2
舉例:
① expr 1 + 2 TMP=$(expr 1 + 2)
② expr 1 + 4 / 3 TMP=$(expr 1 + 4 / 3)
由此我們可以看出在 expr 的數(shù)學(xué)計算中,它是不支持浮點數(shù)的計算的,另外在賦值變量的時候還有一種寫法。
③ expr 1 + 2 * 3(?)
我們看到在第一次執(zhí)行的時候報語法錯誤,這是因為在 bash 腳本中,* 被賦予0到任意一個字符,我們當做乘法運算時,必須得加上轉(zhuǎn)義符(\)才能進行正確的乘法計算。
那么由此可以看出第一種數(shù)學(xué)計算的格式要求相對嚴格一點。
2、第二種:()
格式:$((操作數(shù)1 操作符 操作數(shù)2))
舉例:TMP=$((1 + 3))
我們可以看出第二種數(shù)學(xué)計算的格式相對來說要求較松。
3、第三種:let
格式:let "[變量][操作符] 操作數(shù)1 操作符 操作數(shù)2"
舉例:
① let "3+4"
② let "TMP=3+4"
我們看到第三種數(shù)學(xué)計算的格式要求松,而且計算靈活
那么我們學(xué)習(xí) shell 中的數(shù)學(xué)計算有什么實際用途呢?下來我們就來看一個例子,一個簡單的腳本:
當 /tmp 目錄下文件占用率達到 80% 時,對磁盤文件進行特定的清理,當達到設(shè)定值時對管理員發(fā)一封郵件報警。
實現(xiàn)步驟:
a> 使用 df 命令對 /tmp 目錄進行查看
b> 對磁盤占用率進行計算
我們之前說過它是不支持浮點數(shù)計算的,因此我們先 *100 再進行相除操作。我們看到在進行除法操作之后它的占用率不等于 13%,這是因為它還有一部分空間是給 root 用戶使用的。
c> 判斷是否達到特定值,我們把之前的寫成一個腳本
#! /bin/bash df /tmp ABC=$(expr 5820284 \* 100 / 49410864) echo $ABC if [ $ABC -gt 10 ] then echo "Warning ..." fi
我們來看看結(jié)果
我們看到已經(jīng)達到 10% 了。
d> 根據(jù)第三步的結(jié)果決定報警,并將它寫入到 /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
我們來看看結(jié)果
我們此時已經(jīng)實現(xiàn)報警的功能。
下來我們來看看 shell 中的引用。那么什么叫引用呢?引用便是對 shell 腳本、程序、終端命令、變量以及字符串等結(jié)果的反饋。引用的類型如下所示
"" 雙引號 | ` 反引號 |
'' 單引號 | \ 反斜線 |
那么我們?yōu)槭裁匆M行引用呢?引用的目的就是為了防止不必要的誤會。
舉例:
① echo hello world * 與 echo "hello world *"
我們的本意是輸出 hello world *,可是在第一種情況下,我們不加 "",便導(dǎo)致了它將 * 命令解讀成輸出全部的文件了。
② echo "hello "world " welcome"
我們看到第一種與第二種的區(qū)別了,第二種由于雙引號沒加完,因此它執(zhí)行的結(jié)果會和我們想象的不一樣。
1、雙引號:使用雙引號可引用除字符 $、`、\ 外的任意字符或字符串。
舉例:echo "%#$^ $hello world"
我們看到只輸出了 world,并沒有 hello。
2、單引號:它與雙引號類似,不同的是 shell 會忽略任何引用值。
3、反引號:它用于將系統(tǒng)命令的輸出到變量。
① echo `hello` (錯 ×)
② echo `date` (對 √)
4、反斜線:如果下一個字符有特殊含義,反斜線防止 shell 誤解其含義。
下述字符包含有特殊意義:& * + ^ $ ` " | ?
我們看到在 & 后面的時候,它是報錯了。因為 & 表示由退出的含義,因此在它前面加 \ 則會讓 shell 忽略其特殊含義,以防止誤解。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。