linux shell 脚本学习

222 阅读3分钟

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

shell 脚本

1. shell 环境

常见的Shell 环境有:

  1. Bourne Shell(/usr/bin/sh或/bin/sh)
  2. Bourne Again Shell(/bin/bash)
  3. C Shell(/usr/bin/csh)
  4. K Shell(/usr/bin/ksh)
  5. Shell for Root(/sbin/sh) 由于易用和免费,Bourne Again Shell,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell,在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell。

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  #这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用
      

3. shell 脚本语法简单介绍

3.1. 变量

  ```shell
  email_num="18"
  echo $email_num  # 输出变量
  echo ${email_num} # 输出变量
  unset email_num  # 删除变量
  # 获取字符长度
  string="abcd"
  echo ${#string} #输出 4
  ```
3.1.1 命名规则
  • 变量名和等号之间不能有空格
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)
3.1.1.2 变量类型
  • 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
  • shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

3.2. 数组

```shell
# 定义数组
数组名=(值1 值2 ... 值n)
# 实例
arr=(
1 2 3
)
# 读取数组
${数组名[下标]}
# 取得数组元素的个数
length=${#arr[@]}
# 或者
length=${#arr[*]}
# 取得数组单个元素的长度
lengthn=${#arr[n]}
```

3.3. 基本运算符

3.3.1 算数运算符
# 说明:原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 exprexpr 最常用。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"
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
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
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

3.4 流程控制

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
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
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 (( ; ; ))

3.4.4. until 循环

until 循环执行一系列命令直至条件为 true 时停止

until condition
do
    command
done
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

基本记录了 shell 的基本语法和 shell 脚本的执行方法,以下是实际在服务器上写的 shell 脚本

实例

备份 mongodb 数据库

image.png 备份 mysql 数据库

image.png

批量移动文件

image.png

参考文章地址: www.runoob.com/linux/linux…