21.1 為什麼要學習Shell編程 (1)Linux運維工程師在進行伺服器集群管理時,需要編寫Shell程式來進行伺服器管理。 (2)對於JavaEE和Python程式員來說,工作的需要,你的老大會要求你編寫一些Shell腳本進行程式或者是伺服器的維護,比如編寫一個定時備份資料庫的腳本。 (3)對 ...
21.1 為什麼要學習Shell編程
(1)Linux運維工程師在進行伺服器集群管理時,需要編寫Shell程式來進行伺服器管理。
(2)對於JavaEE和Python程式員來說,工作的需要,你的老大會要求你編寫一些Shell腳本進行程式或者是伺服器的維護,比如編寫一個定時備份資料庫的腳本。
(3)對於大數據程式員來說,需要編寫Shell程式來管理集群。
21.2 Shell是什麼
Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程式的界面系統級程式,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程式。
21.3 Shell編程快速入門
21.3.1 腳本格式要求
(1)腳本以#!/bin/bash開頭
(2)腳本需要可執行許可權
21.3.2 編寫第一個Shell腳本
創建一個Shell腳本,輸出hello world!
21.3.3 腳本的常用執行方式
方式一(輸入腳本的絕對路徑或相對路徑)
(1)首先要賦予myShell.sh腳本x許可權
(2)執行腳本
方式二(sh+腳本),不推薦
說明:不用賦予腳本x許可權,直接執行即可
21.4 shell的變數
21.4.1 shell變數的介紹
(1)Linux Shell中的變數分為,系統變數和用戶自定義變數。
(2)系統變數:$HOME、$PWD、$SHELL、$USER等等。
(3)顯示當前shell中所有變數:set
21.4.2 shell變數的定義
基本語法
(1)定義變數:變數=值
(2)撤銷變數:unset 變數
快速入門
(1)定義變數A
(2)撤銷變數A
(3)聲明靜態的變數B=2,不能unset
21.4.3 定義變數的規則
(1)變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。
(2)等號兩側不能有空格。
(3)變數名稱一般習慣為大寫。
21.4.4 將命令的返回值賦給變數(重點)
(1)C = `ls -l /home`反引號,運行裡面的命令,並把結果返回給變數C
(2)D=$(date)等價於反引號
21.5 設置環境變數
21.5.1 基本語法
(1)export 變數名=變數值 (將shell變數輸出為環境變數)
(2)source 配置文件 (讓修改後的配置信息立即生效)
(3)echo $變數名 (查詢環境變數的值)
21.5.2 快速入門
(1)在/etc/profile文件中定義TOMCAT_HOME環境變數
(2)查看環境變數TOMCAT_HOME的值
註意:在輸出TOMCAT_HOME環境變數前,需要讓其生效
(3)在另外一個shell程式中使用TOMCAT_HOME
21.6 位置參數變數
21.6.1 介紹
當我們執行一個shell腳本時,如果希望獲取到命令行的參數信息,就可以使用到位置參數變數,比如:./myshell.sh 100 200,這個就是一個執行shell的命令行,可以在myshell腳本中獲取參數信息。
21.6.2 基本語法
$n(n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括弧包含,如${10})
$*(這個變數代表命令行中所有的參數,$*把所有的參數看成一個整體)
$@(這個變數也代表命令行中所有的參數,不過$@把每個參數區分對待)
$#(這個變數代表命令行中所有參數的個數)
21.6.3 位置參數變數應用實例
編寫一個shell腳本positionPara.sh,在腳本中獲取到命令行的各個參數信息
21.7 預定義變數
就是shell設計者事先已經定義好的變數,可以直接在shell腳本中使用。
$$(當前進程的進程號(PID))
$!(後臺運行的最後一個進程的進程號(PID))
$?(最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個參數,由命令自己決定),則證明上一個命令執行不正確了。)
21.8 運算符
(1)“$((運算式))”或“$[運算式]”
(2)expr m + n 註意expr運算符間要有空格(+,-,*,/,%)
21.9 條件判斷
[ condition ](註意condition前後要有空格)
#非空返回true,可使用$?驗證(0為true,>1為false)
(1)兩個整數的比較
= 字元串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
(2)按照文件許可權進行判斷
-r 有讀的許可權【-r 文件】
-w 有寫的許可權
-x 有執行的許可權
(3)按照文件類型進行判斷
-f 文件存在並且是一個常規的文件
-e 文件存在
-d 文件存在並且是一個目錄
21.10 流程式控制制
21.10.1 if判斷
if [ 條件判斷式 ]
then
程式
elif [ 條件判斷式 ]
then
程式
fi
註意事項:[ 條件判斷式 ],中括弧和條件判斷式之間必須有空格
21.10.2 case語句
case $變數名 in
"值1")
如果變數的值等於值1,則執行程式1
;;
"值2")
如果變數的值等於值2,則執行程式2
;;*)
如果變數的值都不是以上值,則執行此程式
;;
esac
21.10.3 for迴圈
基本語法1:
for 變數 in 值1 值2 值3...
do
程式
done
基本語法2:
for((初始值;迴圈控制條件;變數變化))
do
程式
done
21.10.4 while迴圈
while [ 條件判斷式 ]
do
程式
done
21.11 read讀取控制台輸入
read(選項)(參數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,就不再等待了。
參數
變數:指定讀取值的變數名
21.12 函數
shell編程和其他編程語言一樣,有系統函數,也可以自定義函數。
系統函數
basename(返回完整路徑最後/的部分,常用於獲取文件名)
basename [pathname] [suffix]
basename [string] [suffix]
suffix為尾碼,如果suffix被指定了,basename會將pathname或string中的suffix去掉。
dirname(返回完整路徑最後/的前面部分,常用於返回lu路徑部分)
dirname 文件絕對路徑(從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然後返回剩下的路徑(目錄的部分))
自定義函數
[function] funname[()]
{
Action;
[return int;]
}
調用直接寫函數名:funname [值]
21.13 Shell編程綜合案例
需求分析:
(1)每天凌晨2:10備份資料庫DB1到/data/backup/db
(2)備份開始和備份結束能夠給出相應的提示信息
(3)備份後的文件要求以備份時間為文件名,並打包成.tar.gz的形式,比如2018-05-04_154833.tar.gz
(4)在備份的同時,檢查是否有10天前備份的資料庫文件,如果有就將其刪除。
腳本代碼如下(mysql_db_backup.sh):
#!/bin/bash
#完成資料庫的定時備份。
#備份的路徑
BACKUP=/data/backup/db
#當前的時間作為文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以輸出變數調試
#echo ${DATETIME}
echo "=======開始備份========"
echo "=======備份的路徑是 $BACKUP/$DATETIME.tar.gz"
#主機
HOST=localhost
#用戶名
DB_USER=root
#密碼
DB_PWD=123456
#備份資料庫名
DATABASE=DB1
#創建備份的路徑
#如果備份的路徑文件夾存在,就使用,否則就創建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#執行mysql的備份資料庫的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包備份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#刪除臨時目錄
rm -rf $BACKUP/$DATETIME
#刪除10天前的備份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=====備份文件成功==========="
註意:
有時候安裝好MySQL程式的時候,直接輸入命令mysql或mysqldump會發現提示命令不存在,這是由於系統預設會查找/usr/bin下的命令,如果這個命令不在這個目錄下,當然會找不到命令
解決方法;
首先得知道mysql命令或mysqldump命令的完整路徑,可以使用find命令查找
find / -name mysql -print
比如mysql的路徑是:/usr/local/mysql/bin/mysql,然後映射一個鏈接到/usr/bin目錄下,相當於建立一個鏈接文件
ln -s /usr/local/mysql/bin/mysql /usr/bin
關註公眾號:Java後端生活,乾貨文章第一時間送到!