zoukankan      html  css  js  c++  java
  • 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
      
  • 相关阅读:
    数与bit
    ARM汇编优化1
    一 *(a+1)与*(&a+1)
    二 *(a+1)多维数组
    三 二维数组取址
    四 sizeof(a)
    永恒之蓝及WannaCry分析
    github使用记录
    三种页面置换算法的C++模拟
    opencv检测图像直线
  • 原文地址:https://www.cnblogs.com/liujiaqi1101/p/13556405.html
Copyright © 2011-2022 走看看