1. 程式人生 > >Shell腳本使用匯總整理

Shell腳本使用匯總整理

class 讀取文件 打印日誌 date tps 定時任務 定時執行 16px 重新

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命令,一般要寫該命令的全路徑,如果不知道全路徑的,可以通過

which 命令,進行查看全路徑,如果需要後臺執行,就在命令最後+空格+&

技術分享圖片

技術分享圖片

三、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腳本使用匯總整理