一.創建腳本
1.創建一個111的自動化腳本,shell腳本以.sh為結尾
vim 111.sh
2,腳本格式開頭
#!/bin/bash
二,變量
變量由字母.數字,下劃線組成,不能以數字開頭,變量名不能有空格,特殊符號,等號兩邊不可有空格,若輸出的值有特俗符號,需要用雙引號包裹
name="yuyu"
echo $name # 輸出:yuyu
echo ${name} # 輸出:yuyu
num=10
echo $num0 # 錯誤:Shell 會識別為變量 num0(未定義,輸出空)
echo ${num}0 # 正確:輸出 100
位置參數變量
#!/bin/bash
echo "腳本名:$0"
echo "第1個參數:$1"
echo "第2個參數:$2"
echo "參數總數:$#"
echo "所有參數(\$*):$*"
echo "所有參數(\$@):$@"
bash test.sh apple banana
# 輸出:
# 腳本名:test.sh
# 第1個參數:apple
# 第2個參數:banana
# 參數總數:2
# 所有參數($*):apple banana
# 所有參數($@):apple banana
特殊變量
echo "當前進程PID:$$"
sleep 10 & # 後台運行sleep
echo "後台進程PID:$!"
echo "上一條命令最後一個參數:$_" # 輸出:10
echo "上一條命令執行狀態:$?" # 輸出:0(成功)
三.函數
#!/bin/bash
# 定義函數(寫法:函數名() { 邏輯體; })
hello() {
echo "Hello, world!"
}
# 調用函數(必須先定義再調用,否則報錯)
hello # 輸出:Hello, world!
#!/bin/bash
NGINX_SERVICE=nginx
# 定義用法提示函數
usage() {
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1 # 非0退出,標識錯誤
}
# case 匹配規則:匹配 $1(第一個參數),匹配到則執行對應分支,;; 表示分支結束
case $1 in
start)
systemctl start $NGINX_SERVICE ;;
stop)
systemctl stop $NGINX_SERVICE ;;
restart)
systemctl restart $NGINX_SERVICE ;;
reload)
systemctl reload $NGINX_SERVICE ;;
status)
systemctl status $NGINX_SERVICE ;;
*) usage ;; # * 匹配所有未命中的情況,調用usage函數並退出
esac
使用方法
bash 111.sh start # 啓動Nginx
bash 111.sh status # 查看狀態
三,for循環備份數據庫,示例
#!/bin/bash
# 定義備份時間戳(年月日時分)
time=`date +%Y%m%d%H%M`
# 數據庫連接信息
user="root"
# 注意:密碼含特殊字符時,單引號包裹避免解析
password='1Qaz@#$2Wsx'
# 定義要備份的數據庫數組
dbname=("mayongjieuser" "zhangzilonguser" "newdb")
ip="172.16.20.136"
# 備份目錄
backup_dir="/root/dumpzhangzilong"
[ ! -d $backup_dir ] && mkdir -p $backup_dir
# 數據庫數組("${dbname[@]}" 表示數組所有元素)
for i in "${dbname[@]}"
do
# 執行 mysqldump 備份,輸出到 時間戳_數據庫名.sql
mysqldump -u${user} -p${password} ${i} -h ${ip} > ${backup_dir}/${time}_${i}.sql
done
四if指令
目錄判斷
if [ ! -d "$backup_dir" ];then#判斷backup_dir目錄是否存在
mkdir $backup_dir#不存在則創建backup_dir目錄
fi#結束
文件判斷
if [ ! -f "$log" ];then#判斷log文件是否存在
touch $log#不存在則創建log文件
fi#結束
常見文件目錄檢測符號
-e 檢查文件目錄是否存在
-d 檢查是否存在目錄
-f 檢查是否存在文件
-L 檢查是否存在軟鏈接
-r 檢查當前用户是否有讀權限
-w 檢查當前用户是否有寫權限
-x 檢查當前用户是否有執行權限