shell 編程
Shell 是一個命令列解釋器,它為用戶提供了一個向 Linux 內核發送請求以便運行程式的界面系統級程式,用戶可以用 Shell 來啟動、掛起、停止甚至是撰寫一些程式,
shell 腳本的執行方式
-
腳本以#!/bin/bash 開頭
-
腳本需要有可執行權限
第一個 Shell 腳本
#!/bin/bash
echo "hello,world~"
腳本的常用執行方式
方式 1 (輸入腳本的絕對路徑或相對路徑)
說明:首先要賦予 helloworld.sh 腳本的 +x 權限, 再執行腳本
./hello.sh 或 /root/shcode/hello.sh
方式 2 ( sh + 腳本)
說明:不用賦予腳本+x 權限,直接執行即可,
sh hello.sh
Shell 的變數
- Linux Shell 中的變數分為,系統變數和用戶自定義變數,
- 系統變數:
$HOME、$PWD、$SHELL、$USER等等 - 顯示當前
shell中所有變數:set
shell 變數的定義
基本語法
定義變數
變數名=值
撤銷變數
unset 變數
宣告靜態變數
readonly 變數
細節說明
- 變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭
- 等號兩側不能有空格
- 靜態變數不能
unset - 變數名稱一般習慣為大寫, 這是一個規范
將命令的回傳值賦給變數
A=date反引號,運行里面的命令,并把結果回傳給變數 A
A=$(date) 等價于反引號
設定環境變數
基本語法
將 shell 變數輸出為環境變數/全域變數
export 變數名=變數值
讓修改后的配置資訊立即生效
source 組態檔
查詢環境變數的值
echo $變數名
快速入門
- 在
/etc/profile檔案中定義TOMCAT_HOME環境變數 - 查看環境變數
TOMCAT_HOME的值 - 在另外一個
shell程式中使用TOMCAT_HOME
注意:在輸出 TOMCAT_HOME 環境變數前,需要讓其生效
source /etc/profile
shell 腳本的多行注釋
:<<!
內容
!
位置引數變數
當執行一個 shell 腳本時,如果希望獲取到命令列的引數資訊,就可以使用到位置引數變數
比如 : ./myshell.sh 100 200 , 這個就是一個執行 shell 的命令列,可以在 myshell 腳本中獲取到引數資訊
基本語法
? $n:n 為數字,$0 代表命令本身,$1-$9 代表第一到第九個引數,十以上的引數,十以上的引數需要用大括號包含,如${10}
? $*:這個變數代表命令列中所有的引數,$* 把所有的引數看成一個整體
? $@:這個變數也代表命令列中所有的引數,不過$@把每個引數區分對待
? $#:這個變數代表命令列中所有引數的個數
實體演示
撰寫一個 shell 腳本 position.sh ,在腳本中獲取到命令列的各個引數資訊
#! /bin/bash
echo "0=$0 1=$1"
echo "引數=$*"
echo "$@"
echo "引數的個數=$#"
輸入:sh position.sh 100 200
預定義變數
就是 shell 設計者事先已經定義好的變數,可以直接在 shell 腳本中使用
基本語法
? $$:當前行程的行程號PID
? $! :后臺運行的最后一個行程的行程號(PID)
? $?:最后一次執行的命令的回傳狀態,如果這個變數的值為 0,證明上一個命令正確執行;如果這個變數的值為非 0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了,
#!/bin/bash
echo "當前執行的行程 id=$$"
#以后臺的方式運行一個腳本,并獲取他的行程號
/root/shcode/myshell.sh &
echo "最后一個后臺方式運行的行程 id=$!"
echo "執行的結果是=$?"
運算子
基本語法
$((運算式))
或
$[運算式]
或
expr m + n
細節說明
- 注意
expr運算子間要有空格, 如果希望將expr的結果賦給某個變數,使用 `` - expr *, /, % 乘,除,取余
應用實體
案例 1:計算(2+3)X4 的值
#! /bin/bash
#使用第一種方式
RES1=$(((2+3)*4))
echo "res1=$RES1"
#使用第二種方式, 推薦使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三種方式 expr
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
條件判斷
判斷陳述句
基本語法
[ condition ]
細節說明
- 注意 condition 前后要有空格
- 非慷訓傳 true,可使用$?驗證(0 為 true,>1 為 false)
應用實體
[ hspEdu ] 回傳 true
[ ] 回傳 false
[ condition ] && echo OK || echo notok 條件滿足,執行后面的陳述句
常用判斷條件
- 字串比較
? =
- 兩個整數的比較
-lt 小于
-le 小于等于 little equal
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
流程控制
if 判斷
基本語法
if [ 條件判斷式 ]
then
代碼
fi
多分支
if [ 條件判斷式 ]
then
代碼
elif [條件判斷式]
then
代碼
fi
細節說明
- [ 條件判斷式 ],中括號和條件判斷式之間必須有空格
應用實體
撰寫一個 shell 程式,如果輸入的引數,大于等于 60,則輸出 "及格了",如果小于 60,則輸出 "不及格"
#! /bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case 陳述句
基本語法
case $變數名 in
"值 1")
如果變數的值等于值 1,則執行程式 1
;;
"值 2")
如果變數的值等于值 2,則執行程式 2
;;
…省略其他分支…
*)
如果變數的值都不是以上的值,則執行此程式
;;
esac
應用實體
當命令列引數是 1 時,輸出 "周一", 是 2 時,就輸出"周二", 其它情況輸出 "other"
#! /bin/bash
case $1 in
"1")
;;
echo "周一"
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
for 回圈
基本語法
for 變數 in 值 1 值 2 值 3…
do
程式/代碼
done
for (( 初始值;回圈控制條件;變數變化 ))
do
程式 /代碼
done
應用實體
- 列印命令列輸入的引數 [這里可以看出$* 和 $@ 的區別]
#! /bin/bash
#使用$*
for i in "$*"
do
echo "num is $i"
done
#使用$@
for i in "$@"
do
echo "num is $i"
done
- 從命令列輸入一個數 n,統計從 1+..+ n 的值是多少?
#! /bin/bash
SUM=0
for(( i=1; i<=$1; i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
while 回圈
基本語法
while [ 條件判斷式 ]
do
程式/代碼
done
細節說明
while和[有空格,條件判斷式和[也有空格
應用實體
從命令列輸入一個數 n,統計從 1+..+ n 的值是多少?
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
#i 自增
i=$[$i+1]
done
echo "執行結果=$SUM"
read 讀取控制臺輸入
基本語法
read(選項)(引數)
選項說明
? -p:指定讀取值時的提示符
? -t:指定讀取值時等待的時間(秒),如果沒有在指定的時間內輸入,就不再等待
引數說明
- 變數:指定讀取值的變數名
應用實體
讀取控制臺輸入一個 NUM2 值,在 10 秒內輸入
read -t 10 -p "請輸入一個數 NUM2=" NUM2
echo "你輸入的 NUM2=$NUM2"
函式
shell 編程和其它編程語言一樣,有系統函式,也可以自定義函式,
系統函式
basename
回傳完整路徑最后 / 的部分,常用于獲取檔案名
basename [pathname] [suffix]
basename [string] [suffix]
basename 命令會刪掉所有的前綴包括最后一個(‘/’)字符,然后將字串顯示出來,
選項說明
- suffix 為后綴,如果 suffix 被指定了,basename 會將 pathname 或 string 中的 suffix 去掉,
dirname
回傳完整路徑最后 / 的前面的部分,常用于回傳路徑部分
dirname 檔案絕對路徑
從給定的包含絕對路徑的檔案名中
應用實體
請回傳 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
自定義函式
基本語法
[ function ] funname[()]
{
Action;
[return int;]
}
呼叫直接寫函式名:funname [值]
應用實體
計算輸入兩個引數的和(動態的獲取), getSum
#!/bin/bash
#定義函式 getSum
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
#輸入兩個值
read -p "請輸入一個數 n1=" n1
read -p "請輸入一個數 n2=" n2
#呼叫自定義函式
getSum $n1 $n2
Shell 編程綜合案例
每天凌晨 2:30 備份 資料庫 hspedu 到 /data/backup/db
備份開始和備份結束能夠給出相應的提示資訊
備份后的檔案要求以備份時間為檔案名,并打包成 .tar.gz 的形式,比如:2021-08-19_130201.tar.gz
在備份的同時,檢查是否有 10 天前備份的資料庫檔案,如果有就將其洗掉,
撰寫 mysql_db_backup.sh
#備份目錄
BACKUP=/data/backup/db
#當前時間
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#資料庫的地址
HOST=localhost
#資料庫用戶名
DB_USER=root
#資料庫密碼
DB_PW=hspedu100
#備份的資料庫名
DATABASE=hspedu
#創建備份目錄, 如果不存在,就創建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#備份資料庫
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip >
${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#將檔案處理成 tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#洗掉對應的備份目錄
rm -rf ${BACKUP}/${DATETIME}
#洗掉 10 天前的備份檔案
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "備份資料庫${DATABASE} 成功~"
設定定時任務,每天凌晨2:30執行
crontab -l
30 2 * * * /usr/sbin/mysql_db_backup.sh
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/294835.html
標籤:其他
上一篇:RPM 與 YUM
