shell腳本&定時任務 編寫Shell腳本 可以將Shell終端解釋器當作人與電腦硬體之間的“翻譯官”。 Shell腳本命令的工作方式有兩種:互動式和批處理。 互動式(Interactive):用戶每輸入一條命令就立即執行。 批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,She ...
shell腳本&定時任務
編寫Shell腳本
可以將Shell終端解釋器當作人與電腦硬體之間的“翻譯官”。
Shell腳本命令的工作方式有兩種:互動式和批處理。
互動式(Interactive):用戶每輸入一條命令就立即執行。
批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。
查看SHELL變數可以發現當前系統已經預設使用Bash作為命令行終端解釋器了:
[root@linuxprobe ~]# echo $SHELL /bin/bash
編寫簡單的腳本
Shell腳本文件的名稱可以任意,但為了避免被誤以為是普通文件,建議將.sh尾碼加上,以表示是一個腳本文件。
第一行的腳本聲明(#!)用來告訴系統使用哪種Shell解釋器來執行該腳本;
第二行的註釋信息(#)是對腳本功能和某些命令的介紹信息,使得自己或他人在日後看到這個腳本內容時,可以快速知道該腳本的作用或一些警告信息;
第三、四行的可執行語句也就是我們平時執行的Linux命令了。
[root@linuxprobe ~]# bash example.sh /root/Desktop total 8 drwxr-xr-x. 2 root root 23 Jul 23 17:31 . dr-xr-x---. 14 root root 4096 Jul 23 17:31 .. -rwxr--r--. 1 root root 55 Jul 23 17:31 example.sh
除了上面用bash解釋器命令直接運行Shell腳本文件外,第二種運行腳本程式的方法是通過輸入完整路徑的方式來執行。但預設會因為許可權不足而提示報錯信息,此時只需要為腳本文件增加執行許可權即可
[root@linuxprobe ~]# ./example.sh bash: ./Example.sh: Permission denied [root@linuxprobe ~]# chmod u+x example.sh [root@linuxprobe ~]# ./example.sh /root/Desktop total 8 drwxr-xr-x. 2 root root 23 Jul 23 17:31 . dr-xr-x---. 14 root root 4096 Jul 23 17:31 .. -rwxr--r--. 1 root root 55 Jul 23 17:31 example.sh
接收用戶的參數
$0對應的是當前Shell腳本程式的名稱,
$#對應的是總共有幾個參數,
$*對應的是所有位置的參數值,
$?對應的是顯示上一次命令的執行返回值,
而$1、$2、$3……則分別對應著第N個位置的參數值。
判斷用戶的參數
按照測試對象來劃分,條件測試語句可以分為4種:
文件測試語句;
邏輯測試語句;
整數值比較語句;
字元串比較語句。
文件測試所用的參數
操作符 | 作用 |
-d | 測試文件是否為目錄類型 |
-e | 測試文件是否存在 |
-f | 判斷是否為一般文件 |
-r | 測試當前用戶是否有許可權讀取 |
-w | 測試當前用戶是否有許可權寫入 |
-x | 測試當前用戶是否有許可權執行 |
下麵使用文件測試語句來判斷/etc/fstab是否為一個目錄類型的文件,然後通過Shell解釋器的內設$?變數顯示上一條命令執行後的返回值。如果返回值為0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:
[root@linuxprobe ~]# [ -d /etc/fstab ] [root@linuxprobe ~]# echo $? 1
再使用文件測試語句來判斷/etc/fstab是否為一般文件,如果返回值為0,則代表文件存在,且為一般文件:
[root@linuxprobe ~]# [ -f /etc/fstab ] [root@linuxprobe ~]# echo $? 0
邏輯“與”的運算符號是&&,它表示當前面的命令執行成功後才會執行它後面的命令。
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist" Exist
邏輯“或”,它在Linux系統中的運算符號為||,表示當前面的命令執行失敗後才會執行它後面的命令:
[root@linuxprobe ~]# echo $USER root [root@linuxprobe ~]# [ $USER = root ] || echo "user" [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user" user
邏輯語句“非”,在Linux系統中的運算符號是一個嘆號(!),它表示把條件測試中的判斷結果取相反值。也就是說,如果原本測試的結果是正確的,則將其變成錯誤的;原本測試錯誤的結果則將其變成正確的。
整數比較運算符僅是對數字的操作,不能將數字與字元串、文件等內容一起操作,而且不能想當然地使用日常生活中的等號、大於號、小於號等來判斷。因為等號與賦值命令符衝突,大於號和小於號分別與輸出重定向命令符和輸入重定向命令符衝突。因此一定要使用規範的整數比較運算符來進行操作。
可用的整數比較運算符
操作符 | 作用 |
-eq | 是否等於 |
-ne | 是否不等於 |
-gt | 是否大於 |
-lt | 是否小於 |
-le | 是否等於或小於 |
-ge | 是否大於或等於 |
字元串比較語句用於判斷測試字元串是否為空值,或兩個字元串是否相同。它經常用來判斷某個變數是否未被定義(即內容為空值),理解起來也比較簡單。
常見的字元串比較運算符
操作符 | 作用 |
= | 比較字元串內容是否相同 |
!= | 比較字元串內容是否不同 |
-z | 判斷字元串內容是否為空 |
接下來通過判斷String變數是否為空值,進而判斷是否定義了這個變數:
[root@linuxprobe ~]# [ -z $String ] [root@linuxprobe ~]# echo $? 0
流程式控制制語句
if條件測試語句
單分支的if語句
雙分支的if條件語句
多分支的if條件語句
for條件迴圈語句
for迴圈語句允許腳本一次性讀取多個信息,然後逐一對信息進行操作處理。
for迴圈語句的語法格式
while條件迴圈語句
while條件迴圈語句是一種讓腳本根據某些條件來重覆執行命令的語句,它的迴圈結構往往在執行前並不確定最終執行的次數,完全不同於for迴圈語句中有目標、有範圍的使用場景。while迴圈語句通過判斷條件測試的真假來決定是否繼續執行命令,若條件為真就繼續執行,為假就結束迴圈。
while迴圈語句的語法格式
case條件測試語句
case語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;而如果數據不在所列出的範圍內,則會去執行星號(*)中所定義的預設命令。
case條件測試語句的語法結構
計劃任務服務程式
一次性計劃任務只執行一次,一般用於滿足臨時的工作需求。我們可以用at命令實現這種功能,只需要寫成“at 時間”的形式就可以。如果想要查看已設置好但還未執行的一次性計劃任務,可以使用“at -l”命令;要想將其刪除,可以用“atrm 任務序號”。在使用at命令來設置一次性計劃任務時,預設採用的是互動式方法。
[root@linuxprobe ~]# at 23:30 at > systemctl restart httpd at > 此處請同時按下Ctrl+d來結束編寫計劃任務 job 3 at Mon Apr 27 23:30:00 2015 [root@linuxprobe ~]# at -l 3 Mon Apr 27 23:30:00 2016 a root
如果希望Linux系統能夠周期性地、有規律地執行某些具體的任務,那麼Linux系統中預設啟用的crond服務簡直再適合不過了。
創建、編輯計劃任務的命令為“crontab -e”,查看當前計劃任務的命令為“crontab -l”,刪除某條計劃任務的命令為“crontab -r”。另外,如果您是以管理員的身份登錄的系統,還可以在crontab命令中加上-u參數來編輯他人的計劃任務。
在正式部署計劃任務前,請先跟劉遄老師念一下口訣“分、時、日、月、星期 命令”。這是使用crond服務設置任務的參數格式。需要註意的是,如果有些欄位沒有設置,則需要使用星號(*)占位。
使用crond設置任務的參數格式
使用crond設置任務的參數欄位說明
欄位 | 說明 |
分鐘 | 取值為0~59的整數 |
小時 | 取值為0~23的任意整數 |
日期 | 取值為1~31的任意整數 |
月份 | 取值為1~12的任意整數 |
星期 | 取值為0~7的任意整數,其中0與7均為星期日 |
命令 | 要執行的命令或程式腳本 |