12-Shell(2)

流程控制

case

  • 基本语法

    case $变量名 in
    "值1")
    如果变量的值等于值1,则执行程序1
    ;;
    "值2")
    如果变量的值等于值2,则执行程序2
    ;;
    
    // …省略其他分支…
    
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
    
  • 注意事项

    • case 行尾必须为单词 in,每一个模式匹配必须以右括号 ) 结束
    • 双分号 ;; 表示命令序列结束,相当于 Java 中的 break
    • 最后的 *) 表示默认模式,相当于 Java 中的 default
  • 案例:当命令行参数是 1 时,输出 "周一";是 2 时,就输出"周二";其它情况输出 "other"

for

  • 基本语法
    for 变量 in 值1 值2 值3 …
    do
        程序
    done
    ·····································
    for (( 初始值;循环控制条件;变量变化 ))
    do
        程序
    done
    
  • 案例
    • 打印命令行输入的参数 // 加双引号可以看出 $*$@ 的区别
      • $*$@ 都表示传递给函数或脚本的所有参数,不被双引号包含时,都以$1$2$n 的形式输出所有参数
      • 当它们被双引号包含时,$* 会将所有的参数作为一个整体,以 $1 $2 … $n 的形式输出所有参数,所以循环只会进行一次;$@ 会将各个参数分开,以 $1$2$n的形式输出所有参数,故有几个参数,就会执行几次循环
    • 从 1 加到 100 的值输出显示

while

  • 基本格式
    while [ 条件判断式 ]
    do
        程序
    done
    
  • 应用实例:从命令行输入一个数 n,统计从 1 + ... + n 的值是多少?

读取控制台输入

  • 基本语法:read [选项] [参数: 指定读取值的变量名]
  • 选项
    • -p 指定读取值时的提示符
    • -t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
  • 应用实例

Shell 函数

Shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。

系统函数

系统函数中,我们这里就介绍如下这俩。

basename

  • 功能:返回完整路径最后 / 之后的部分,常用于获取文件名
  • 基本语法
    • basename [pathname] [suffix]
    • basename [string] [suffix]
  • 选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉

dirname

  • 基本语法:dirname 文件绝对路径
  • 功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。简单来说,就是返回完整路径最后一个 / 前面的部分。常用于返回路径部分

自定义函数

  • 基本语法
    [ function ] funName[()]
    {
        Action;
        [return int;]
    }
    
  • Tips
    • function 和 () 均可省略,但不能同时省略。如果函数有形参,不必在 () 内声明,直接在函数体内调用提供的参数即可
    • 必须在调用函数地方之前,先声明函数!Shell 脚本是就是逐行运行脚本中的命令,不会像其它语言一样先编译
    • 函数返回值,只能通过 $? 系统变量获得,可以显示加:return 返回;如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0~255)
  • 应用实例:计算输入两个参数的和 getSum

Shell 工具

cut

  • 概述:cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
  • 基本语法:cut [选项参数] filename
  • 选项参数
    • -f 列号,提取第几行
    • -d 分隔符,按照指定分隔符分割列
    • -c 制定具体的字符
  • 示例

sed

概述

sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

基本语法

sed [选项参数] {command} filename

  • 选项参数说明
    • -e 直接在指令列模式上进行 sed 的多个动作的编辑
    • -i 直接编辑文件
  • 命令功能描述(先指定范围,再指定操作)
    • a 新增,a 的后面可以接字符串,在下一行出现
    • d 删除
    • s 查找并替换,配合 g (global) 全文替换

范围的确定方式

根据 [行号] 或者 [正则]

   转义
^   一行的开头
    ^R 表示以 R 开头的行
$   匹配一行的结束
    R$ 表示以 R 结尾的行
*   表示上一个子式匹配 0 次或多次(贪心匹配)
    Zo* {Z | Zo | Zoo | ...}
.   匹配一个任意的字符
    .* 匹配一个任意字符串
[]  表示匹配某个范围内的字符
    [a-z] ----- 匹配一个 a-z 之间的字符
    [a-z]*----- 匹配一个任意字母字符串

示例

  • 测试 a 的增加操作


  • 测试 d 的删除操作
  • 测试 s 的替换操作

  • 测试 -i 参数
  • 测试 -e 参数

awk

概述

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

基本用法

  • 基本语法
    awk [选项参数] ‘pattern1{action1}  pattern2{action2} ...’ filename
        > pattern:表示 AWK 在数据中查找的内容,就是匹配模式
        > action:在找到匹配内容时所执行的一系列命令
    
  • 选项参数
    • -F 指定输入文件折分隔符
    • -v 赋值一个用户定义变量
  • 示例

内置变量

sort

  • 概述:sort 命令是在 Linux 里非常有用,它将文件进行排序,并将排序结果标准输出。
  • 基本语法:sort [选项] [指定待排序的文件列表]
  • 选项说明
    • -n 依照数值的大小排序(若不指定该选项,则使用字符串比较方式)
    • -r 以相反的顺序来排序
    • -t 设置排序时所用的分隔字符
    • -k 指定需要排序的列
  • 示例

练习题

  • 查询文件中的空行行号:cat testFile | awk '/^$/{print NR}'
  • 有文件内容如下,使用 Linux 命令计算第二列的和并输出
    [score.txt]
        张三 40
        李四 50
        王五 60
    ······································································
    [命令] cat score.txt | awk -F " " 'BEGIN{sum=0}{sum+=$2}END{print sum}'
    
  • Shell 脚本里如何检查一个文件是否存在?如果不存在该如何处理?
    #!/bin/bash
    if [ -f file.txt ]; then
        echo "文件存在!"
    else
        echo "文件不存在!"
    fi
    
  • 用 Shell 写一个脚本,对文本中无序的一列数字排序
    cat testFile | sort -n
    
  • 用 Shell 脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符 "root" 的文件名称

定时维护数据库

需求分析

  1. 每天凌晨 2:10 备份数据库 test 到 /data/backup/db
  2. 备份开始和备份结束能够给出相应的提示信息
  3. 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2018-03-12_230201.tar.gz
  4. 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除

思路分析

代码实现

  • mysql_db_backup.sh
  • 测试脚本
  • 定时代码:
    [键入指令] crontab -e
    [文件内容] 10 2 * * * /usr/sbin/mysql_db_backup.sh
    
原文地址:https://www.cnblogs.com/liujiaqi1101/p/13556405.html