linux shell 脚本

關鍵字 :linux shell
在实际工作中涉及到数据库/文档定时备份的需求,因此学习了shell脚本。在此总结记录下

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)
由于易用和免费,Bourne Again Shell,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell,在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell。

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命令查看保留关键字)
      1.3.1.2 变量类型

  • 局部变量: 局部变量在脚本或命令中定义,仅在当前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 数据库


备份 mysql 数据库


批量移动文件



★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論