在实际工作中涉及到数据库/文档定时备份的需求,因此学习了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 关系运算符
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 布尔运算符
1.3.3.4 逻辑运算符
1.3.4 流程控制
1.3.4.1. if else
1.3.4.2. for 循环
1.3.4.4. until 循环
until 循环执行一系列命令直至条件为 true 时停止
1.3.4.5. case ... esac
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break

批量移动文件

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,检测左边的数是否大于右边的,相等返回 truethen
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 数据库

批量移动文件

評論