Shell腳本使用匯總整理
Shell腳本使用匯總整理
一、Shell腳本常用的頭部格式:
頭部的作用就是告知linux此腳本的類型;
常用的頭部格式如下:(/bin/bash,是bash的路徑,如果不知道路徑可以通過which bash進行查看,其它命令的路徑也是類似查看的)
(1)#!/bin/bash:普通的linux腳本,也是最常用的,不需要交互;
(2)#!/usr/bin/expect:可以自動交互的linux腳本,有可能需要安裝expect,如果linux服務器上沒有此expect命令的話。
二、Shell腳本中如何執行Linux或自定義的腳本命令:
在普通的#!/bin/bash腳本中,執行linux命令,一般要寫該命令的全路徑,如果不知道全路徑的,可以通過
三、Shell腳本中如何進行自動交互:
如果需要在shell腳本中實現自動交互,一般是通過expect進行實現的,方便好用,需要註意的是expect腳本中可能是不能執行一些linux命令的,如果一定需要執行該linxu命令,可以將該Linxu命令寫入到一個普通的shell腳本中去,然後在expect腳本中通過調用執行該linux命令的普通腳本,從而實現需求;
Expect腳本具體寫法可以參考以下連接:
https://www.cnblogs.com/lixigang/articles/4849527.html
四、Shell腳本如何定時執行:
Linux中定時執行shell腳本,可以通過crond進行控制,需要linux中安裝crond,並在通過crontab -e命令進行配置,具體參照以下連接:
https://www.cnblogs.com/bcphp/p/7084967.html
設定定時任務:
crontab -e 然後添加一條定時任務信息 保存文件 service crond restart
修改定時任務:
crontab -e 然後修改某個定時任務信息 保存文件 service crond restart
刪除定時任務:
crontab -e 然後刪除某個定時任務信息 保存文件即可 service crond restart
查看定時任務:
crontab -l
五、腳本中常用功能:
1、定義變量:
變量名+等號+值(如果是非數字的建議加上雙引號)
2、獲取變量:
(1)$變量名:此方法獲取不太好,沒有明確的變量邊界;
(2)${變量名}:建議用此方法,變量名有明確的邊界;
3、定義數組:
變量名+等號+括號(括號中的內容用空格分割)
4、獲取數組中某個角標的值:
${數組名[角標]}:此方法可以獲取某個數組中某個角標的值
5、獲取當前日期:
6、獲取幾天前日期:
7、獲取幾天後日期:
將幾天的數字修改為負數即可
8、增強for循環:
9、普通for循環:
10、輸出信息:
echo 變量或字符串都可以,用雙引號擴住即可;
11、字符串拼接:
直接變量加字符串拼接就行,不需要有+;
12、字符串剪切:
(1)從左邊第幾個字符開始,截取幾個字符:
(2)從左邊第幾個字符開始,一直到結束:
(3)從右邊第幾個字符開始,截取幾個字符:
(4)從右邊第幾個字符開始,一直到結束:
13、字符串分隔:
14、條件判斷if:
15、常用的運算符:
(1)算數運算符:
(2)關系運算符:
(3)布爾運算符:
(4)字符串運算符:
(5)文件測試運算符:
16、讀取文件中的數據存儲到一個數組中去:
17、讀取文件中的鍵值對數據存儲到一個map中去:
註意:文件中的值一定要是鍵值對的形式,並且第一列中的名稱一般是定死的,不能任意修改;
主要思路:
(1)首先通過兩次讀取兩列的內容存儲到兩個數組中去;
(2)然後遍歷一個數組,用第一個數組中的值作為key,第二個數組中的值作為value值,存儲到map中去;
(3)在需要的時候,可以從map中通過輸入某個key值獲取其value值;
默認是用空格分列的:
指定分列的符號為“=”:
18、判斷一個文件是否存在:
判斷文件使用:-f
19、判斷一個文件夾是否存在:
判斷文件夾使用-d
20、定義一個map以及常見使用方法:
如果()中沒有內容,那就是一個空map;
其它shell基本常用功能見連接:
http://www.runoob.com/linux/linux-shell.html
六、通過shell腳本定時自動備份mysql數據庫數據到sql文件:
1、主要思路:
(1)定義一個數據庫備份信息的txt文件,其中有以下幾項:
用戶名
密碼
備份的數據庫(多個庫用逗號分隔)
備份數據文件的路徑
保留備份文件的天數
數據導出工具mysqldump的文件路徑
(2)定義一個腳本.sh文件,具體功能如下:
讀取txt文件中的信息到一個map中去;
獲取備份的數據庫字符串,通過分割,結果存儲到數組中;
獲取當前日期和保留文件天數以前的日期;
首先通過遍歷備份數據庫數組,刪除保留文件天數外的sql文件;
然後再次遍歷備份數據庫數組,導出數據庫中的數據到sql文件;
(3)通過crontab -e命令編輯crontab文件,將後臺定時執行腳本.sh文件,然後service crond restart重新啟動crond,以便通過crond定時執行腳本文件,實現定時備份mysql數據庫中的數據到sql文件中去。
2、具體代碼:
(1)備份數據庫信息的txt信息如下:
username=root password=123456 backupsFileStr=/wocloud/db/backups backupsFileDay=3 mysqldumpStr=/usr/bin/mysqldump copydb=jeecg,kettle,km,dataSharing,hebei,reportSystem
(2)腳本.sh文件信息如下:
#!/bin/sh #db_backups_conf.txt文件路徑 db_backups_conf="/wocloud/shell/db_backups_conf.txt" #判斷文件是否存在 if [ -f "${db_backups_conf}" ];then echo $(date +‘%Y-%m-%d %H:%M:%S‘)" 數據庫配置信息文件存在,開始進行數據備份" #獲取等號前內容,作為map中的Key值 dbArrOne=($(awk -F‘[=]‘ ‘{print $1}‘ ${db_backups_conf} )) #獲取等號後內容,作為map中的value值 dbArrTwo=($(awk -F‘[=]‘ ‘{print $2}‘ ${db_backups_conf})) #創建一個空map declare -A map=() #通過循環,將db_backups_conf配置文件中的信息存儲在map中 for((i=0;i<${#dbArrOne[@]};i++)) do map[${dbArrOne[i]}]=${dbArrTwo[i]} done #獲取備份數據庫的字符串 copyDb=${map["copydb"]} #獲取默認的字符串分隔符 old_ifs="$IFS" #設置字符串分隔符為逗號 IFS="," #將備份數據庫value值的字符串進行分隔,獲取一個數組 dbArr=($copyDb) #將字符串的分隔符重新設置為默認的分隔符 IFS="$old_ifs" #獲取當前年月日 saveday=$(date +%Y%m%d) #獲取超出備份天數的年月日 delday=$(date -d ${map["backupsFileDay"]}‘ days ago‘ +%Y%m%d) #遍歷要備份的數據庫,刪除兩天前備份的數據文件 for delDb in ${dbArr[@]}; do echo $(date +‘%Y-%m-%d %H:%M:%S‘)" 刪除文件:"${map["backupsFileStr"]}/${delDb}_database_${delday}.sql rm -f ${map["backupsFileStr"]}/${delDb}_database_${delday}.sql done #遍歷要備份的數據庫,備份數據文件 for saveDb in ${dbArr[@]}; do echo $(date +‘%Y-%m-%d %H:%M:%S‘)" 備份數據庫:"${saveDb} ${map["mysqldumpStr"]} -u${map["username"]} -p${map["password"]} ${saveDb} > ${map["backupsFileStr"]}/${saveDb}_database_${saveday}.sql done echo $(date +‘%Y-%m-%d %H:%M:%S‘)" 數據備份完畢,腳本執行完畢" else echo "文件不存在" fi
(3)crontab定時後臺執行shell腳本命令如下:(一定要將shell腳本重定向到一個文件中去,以便接收shell腳本的echo輸出信息和異常信息)
二、腳本中打印日誌信息,制作腳本執行日誌文件:
在編寫腳本過程中,關鍵的步驟點,可以通過echo打印日誌信息到桌面顯示屏中。一般編寫的shell腳本都是需要定時執行的,一般通過crond就可以簡單的實現shell腳本的定時執行,通過crontab -e編寫定時任務的時候,一定要記住,將shell腳本中打印日誌的信息重定向到一個文件中去,這樣就可以通過觀察此文件中的日誌信息來觀察shell是否正常運行了。
輸出日誌常用格式:年-月-日 時:分:秒 日誌內容
Shell腳本使用匯總整理