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命令,一般要寫該命令的全路徑,如果不知道全路徑的,可以通過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是否正常運行了。

輸出日志常用格式:年--日 時:分:秒 日志內容

crond中設定定時任務時,重定向的日志文件,最好是在一個文件夾下,每次輸出一個文件,這樣文件添加一個日期就可以輕松解決,以后也方便查看日志:文件名_日期.txt

12 10 * * * /wocloud/shell/mysqlBackupsSql.sh &>/wocloud/shell/mysqlBackupsLogs/mysqlBackupsEcho_`date +\%Y-\%m-\%d`.txt 2>&1

非常注意:日志格式化中用的是斜號(Esc下面那個鍵),不是單引號;

 七、常用的工具化sh腳本:

1、達夢數據庫備份腳本:

https://www.cnblogs.com/lsy-blogs/p/10174171.html

2、mysql數據庫5.7.8以前版本備份腳本:

https://www.cnblogs.com/lsy-blogs/p/10174218.html

3、mysql數據庫5.7.8以后版本備份腳本:

https://www.cnblogs.com/lsy-blogs/p/10174252.html

4、文件夾及子文件備份腳本:

https://www.cnblogs.com/lsy-blogs/p/10174297.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM