在实际工作中涉及到数据库/文档定时备份的需求,因此学习了shell脚本。在此总结记录下
1. shell 脚本
1.1 shell 环境
常见的Shell 环境有:
1.2 简单的 shell 脚本
拿 mysql 备份脚本 mysql.sh 做介绍,脚本如下
1.3 shell 脚本语法简单介绍
shell 脚本语法简单介绍
1.3.1. 变量命名规则
1.3.2. 数组
1.3.3 基本运算符
1.3.3.1 算数运算符
1.3.3.2 关系运算符
1. shell 脚本
1.1 shell 环境
常见的Shell 环境有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
1.2 简单的 shell 脚本
拿 mysql 备份脚本 mysql.sh 做介绍,脚本如下
#!/bin/sh
#用户名
username=mysql
#密码
password=root
base_dir="/home/admin/backup/mysql_bak"
#日志地址
mysql_backup_log="${base_dir}/mysql_backup.log"
#备份地址
backup_path="${base_dir}/sql_package"
#当前日期
date=$(date +"%Y-%m-%d")
#备份的文件名
filename=$backup_path/$date.sql.gz
#打印日志
echo "开始备份,备份日期: $(date +'%Y-%m-%d %H:%M:%S')" >> "$mysql_backup_log"
#back up备份全部并压缩
/usr/bin/mysqldump -u$username -p$password --add-drop-table --lock-tables --all-databases --compact | gzip > $filename
#打印日志
echo "备份成功,备份路径: $filename" >> "$mysql_backup_log"
#只保留最近10天的数据
find $backup_path -name "*.sql.gz" -type f -mtime +10 -exec rm -rf {} \;
说明:- #! 告诉系统这个脚本需要什么解释器来执行
- 执行方法
1. 作为可执行程序
cd 到 mysql.sh 所在目录
chmod +x ./mysql.sh #使脚本具有执行权限
./mysql.sh #执行脚本
2. 作为解释器参数
/bin/sh mysql.sh #这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用
1.3 shell 脚本语法简单介绍
shell 脚本语法简单介绍
1.3.1. 变量命名规则
email_num="18"
echo $email_num # 输出变量
echo ${email_num} # 输出变量
unset email_num # 删除变量
# 获取字符长度
string="abcd"
echo ${#string} #输出 4
1.3.1.1 命名规则
- 变量名和等号之间不能有空格
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
- 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
- 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
- shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
1.3.2. 数组
# 定义数组
数组名=(值1 值2 ... 值n)
# 实例
arr=(
1 2 3
)
# 读取数组
${数组名[下标]}
# 读取数组
${数组名[下标]}
# 取得数组元素的个数
length=${#arr[@]}
# 或者
length=${#arr[*]}
# 取得数组单个元素的长度
lengthn=${#arr[n]}
1.3.3 基本运算符
1.3.3.1 算数运算符
# 说明:原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作,*注意使用的是反引号 “`” 而不是单引号 “'”*
a=10
b=20
val=`expr $a + $b` # 加法
echo "a + b : $val"
val=`expr $a - $b` # 减法
echo "a - b : $val"
val=`expr $a \* $b` # 乘法,乘号(*)前边必须加反斜杠(\)才能实现乘法运算
echo "a * b : $val"
val=`expr $b / $a` # 除法
echo "b / a : $val"
val=`expr $b % $a` # 取余
echo "b % a : $val"
1.3.3.2 关系运算符
a=10
b=20
if [ $a -eq $b ] # -eq,检测两个数是否相等,相等返回 true
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ] # -ne,检测两个数是否不相等,相等返回 true
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ] # -gt,检测左边的数是否大于右边的,相等返回 true
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ] # -lt,检测左边的数是否小于右边的,相等返回 true
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ] # -ge,检测左边的数是否小于右边的,相等返回 true
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ] # -le,检测左边的数是否小于等于右边的,相等返回 true
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
1.3.3.3 布尔运算符
a=10
b=20
if [ $a != $b ] # 非运算,表达式为 true 则返回 false,否则返回 true
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ] # 与运算,两个表达式都为 true 才返回 true
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ] # 或运算,有一个表达式为 true 则返回 true
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
1.3.3.4 逻辑运算符
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]] # 逻辑的 AND
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]] # 逻辑的 OR
then
echo "返回 true"
else
echo "返回 false"
fi
1.3.4 流程控制
1.3.4.1. if else
# 1. if 语句语法格式
if condition
then
command1
...
commandN
fi
# 2. if else 语句语法格式
if condition
then
command1
...
commandN
else
command
fi
# 3. if else-if else 语句语法格式
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
1.3.4.2. for 循环
# 多行
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 一行
for var in item1 item2 ... itemN; do command1; command2… done;
# 实例
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
1.3.4.3. while 语句# 语法
while condition
do
command
done
#实例
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
# 无限循环语法格式
# 1.
while :
do
command
done
# 2.
while true
do
command
done
#3.
for (( ; ; ))
1.3.4.4. until 循环
until 循环执行一系列命令直至条件为 true 时停止
until condition
do
command
done
1.3.4.5. case ... esac
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break
# 语法
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
# 实例
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
实战
备份 mongodb 数据库
批量移动文件
評論