shell腳本
什么是shell?
shell是“殼”的意思,它的主要作用主要是充當解釋器為用戶和系統內核之間提供一個橋梁,同時shell也是一門腳本語言,利用它可以寫一些程式,
shell腳本的執行要求
- 以
#!/bin/bash開頭 - 腳本具有可執行權限
執行方式
- 方式1:chmod命令加權限,然后
./xxx.sh執行 - 方式2:
sh xxx.sh執行
注釋
# 這是單行注釋
:<<!
這是
多行
注釋
!
變數
- shell的變數分為系統變數和自定義變數兩個,
- 系統變數如:
$HOME、$PWD、$SHELL、$USER等, - 顯示當前shell中的所有變數
set
定義變數
定義變數的格式
語法:變數名=值
#!/bin/bash
A=666
echo A=$A # $表示使用變數
定義變數的規則
- 可以有字母、數字、下劃線組成,但不能以數字開頭
- 等號兩側不能有空格
- 一般習慣用大寫
撤銷變數
語法:unset 變數名
#!/bin/bash
A=123
echo A=$A
# 撤銷
unset A
echo A=$A
靜態變數
靜態變數是定義后不能被改變的變數(撤銷和重新賦值),在變數前面加上readonly即可定義靜態變數,
#!/bin/bash
readonly A=123
echo A=$A
# unset A # 撤銷A會報錯
# A=222 # 重新賦值也會報錯
命令回傳值作為變數值
#!/bin/bash
# 形式一
A=`date`
# 形式二
B=$(date)
設定環境變數
語法:export 變數名=值,假如直接在終端中輸入,只是暫時性的設定環境變數,只有當前用戶一退出登錄,就會失效,要長久保存需要寫入到一個檔案中:/etc/profile
步驟:
- 在組態檔中寫入:export 變數名=值
- 載入:source 組態檔路徑
位置引數變數
假如腳本中需要輸入引數時如:./myshell.sh 1 2 3,我們就需要用到位置引數變數,
shell中要拿到命令列的引數,有一套規則:
$n取一個引數,n為數字,$0代表命令本身,$1~$9代表第一到第九個引數,10個以上的引數時,用大括號括起來,如${10},$*命令列的所有引數,當成一個整體$@命令列的所有引數,每個引數有區分$#命令列的引數
比如創建一個myshell.sh檔案,寫入如下內容:
#!/bin/bash
echo $0
echo $1
echo $2
echo $*
echo $@
echo $#
命令列執行:
[lczmx@rH7-1 code]$ sh myshell.sh 11 12 13
回傳:
var.sh
11
12
11 12 13
11 12 13
3
預定義變數
預定義變數就是shell設計者事先定義好的變數,我們可以直接在shell中使用,
- $$ 當前行程的行程號
- $! 后臺運行的最后一個行程的行程號
- $? 最后一次執行命令的回傳狀態,0表達上個命令成功,否則表示不正確,
運算子
如何在shell中進性運算操作?shell中有三種方式:
$((運算子))$[運算子]\`expr m + n\`, 注意要有空格,賦值要有反引號,注意乘法運算子:\*
#!/bin/bash
# 計算 (4 + 5)*5
# 方式1
RES1=$(((4+5)*5))
echo "res1=$RES1"
# 方式2
RES2=$[(4+5)*5]
echo "res2=$RES2"
# 方式3
TEMP=`expr 4 + 5`
RES3=`expr $TEMP \* 5`
echo "res3=$RES3"
流程控制
條件判斷
語法格式一:
if [ 條件 ]
then
代碼
fi
語法格式二:
if [ 條件 ]
then
代碼
elif [ 條件 ]
then
代碼
fi
注意條件前后有空格,可以使用$?檢驗
常用判斷條件有那些?
- 字串
=
- 數值
-lt小于-le小于等于-eq等于-gt大于-ge大于等于-ne不等于
- 檔案權限
-r有讀權限-w有寫權限-x有執行權限
- 檔案型別
-f檔案-d目錄-e路徑存在
非慷訓傳true, 如:[ hello ]; 慷訓傳false,如:[ ]
例子
#!/bin/bash
######## 字串
if [ "abc" = "efs" ]
then
echo "相等"
fi
######## 數值
if [ 12 -eq 12 ]
then
echo "12 = 12 "
fi
######## 檔案
if [ -f ./var.sh ]
then
echo "檔案存在"
fi
case陳述句
語法
case $變數名 in
值1)
代碼
;;
值2)
代碼
;;
*) # 以上都不符合時執行
代碼
;;
esac
例子
#!/bin/bash
case $1 in
1)
echo "拇指"
;;
2)
echo "食指"
;;
3)
echo "中指"
;;
4)
echo "無名指"
;;
5)
echo "小指"
;;
*)
echo "輸入1~5的數"
;;
esac
for回圈
語法一
for 變數 in 值
do
代碼
done
例子
#!/bin/bash
# 回圈列印引數值
for i in "$*"
do
echo "num is $i"
done
echo "=========================="
for j in "$@"
do
echo "num in $j"
done
語法二
for (( 初始值; 回圈條件; 變數變化 ))
do
代碼
done
例子
#!/bin/bash
# 累加求和
SUM=0
for (( i=0; i<=$1; i++ ))
do
SUM=$[ $SUM + i ]
done
echo "結果是$SUM"
while回圈
語法
while [ 條件 ] # 注意有空格
do
代碼
done
舉一個和for回圈第二個例子效果一樣的例子:
#!/bin/bash
# 數字累加求和
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "結果為: $SUM"
read 讀取控制臺輸入
語法
read [選項] 變數
選項
-p 提示內容
-t 等待時間,不寫這個時,會一直等待輸入
注意:假如是多個變數是需要用空格隔開,而且鍵盤輸入時也用空格分隔
例子:
#!/bin/bash
# 讀取一個變數
# 等十秒
read -p "輸入一個數字" -t 10 NUM1
RES1=$[$NUM1*2]
echo "該數字的兩倍是:$RES1"
# 讀取兩個變數
read -p "輸入兩個數字" NUM2 NUM3
RES2=$[$NUM2+$NUM3]
echo "這兩個數的和為:$RES2"
函式
和其他語言一樣,shell也有函式,shell的函式有系統函式和自定義函式之分,
系統函式
系統函式實質上就是我們用到的linux命令,這里講basename和dirname
basename: 獲取檔案基本名稱
如:basename /home/xxx/a.txt,回車,顯示:a.txt,
同時可以去除后綴:basename /home/xxx/a.txt .txt,回車,顯示:a.
而dirname:獲取非檔案名的目錄部分
如:dirname /home/xxx/a.txt,回車,顯示: /home/xxx
自定義函式
語法:
function 函式名 [()]
{
代碼
[return init;]
}
呼叫時的格式:函式名 [值],
例子:
#!/bin/bash
function getSum () {
RES=$[ $n1+$n2 ]
echo "$n1和$n2的和為:$RES"
}
read -p "輸入第一個數:" n1
read -p "輸入第二個數:" n2
getSum $n1 $n2
實體 -- 定時備份資料庫
- 每天3:30備份資料庫到/data/backup/db
- 備份開始和結束時都有提示
- 檔案名以備份時間命名,并打包成.tar.gz
- 檢查是否有十天前的備份,有則洗掉
補充,備份命令:
mysqldump -uxxx -pxxx --host=xxx --port=xxx -q -R --databases xxx
| 引數名 | 縮寫 | 含義 |
|---|---|---|
| --host | -h | 服務器IP地址 |
| --port | -P | 服務器埠號 |
| --user | -u | MySQL 用戶名 |
| --pasword | -p | MySQL 密碼 |
| --databases | -B | 指定要備份的資料庫 |
| --all-databases | -A | 備份mysql服務器上的所有資料庫 |
| --quick | -q | 不緩沖查詢,直接匯出到標準輸出,默認為打開狀態 |
| --routines | -R | 匯出存盤程序以及自定義函式 |
① 創建一個腳本
vim /home/lczmx/code/backupMysqlData.sh:
#!/bin/bash
BACKUP_PATH=/data/back/db # 備份目錄
DATETIME=$(date +%Y-%m-%d_%H%M%S) # 執行date命令,獲取當前時間,并格式化
# 資料庫地址
DB_HOST=localhost
# 資料庫埠
DB_PORT=3306
# 資料庫用戶名
DB_USER=root
# 資料庫密碼
DB_PWD=12345
# 要備份的資料庫名
DATEBASE=data
# 檢查備份目錄
[ ! -d "${BACKUP_PATH}/${DATETIME}" ] && mkdir -p "${BACKUP_PATH}/${DATETIME}"
# 備份資料庫
mysqldump -u${DB_USER} -p${DB_PWD} --host=${DB_HOST} --port=${DB_PORT} -q -R --databases ${DATEBASE} > ${BACKUP_PATH}/${DATETIME}/${DATETIME}
# 打包成tar.gz
cd ${BACKUP_PATH} # cd過去,使用絕對路徑會導致多層目錄壓縮,即連帶/data/...壓縮
tar -zcvf ${DATETIME}.tar.gz ${DATETIME}
# 洗掉備份目錄
rm -rf ${BACKUP_PATH}/${DATETIME}
# 洗掉超過十天的備份檔案, 這是一個固定的用法,find命令后面接-exec可以執行命令
find /data/back/db/ -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
② 設定定時任務
輸入:crontab -e命令,回車后輸入以下內容:
30 3 * * * /home/lczmx/code/backupMysqlData.sh
我的github
我的博客
我的筆記
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/240739.html
標籤:其他
上一篇:Virtual BOX 使用U盤或者現有硬碟啟動虛擬機;Virtual Box 使用物體硬碟啟動虛擬機;Virtual Box 使用物體U盤啟動虛擬機;
