流程控制
case
-
基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; // …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
-
注意事项
- case 行尾必须为单词
in
,每一个模式匹配必须以右括号)
结束 - 双分号
;;
表示命令序列结束,相当于 Java 中的 break - 最后的
*)
表示默认模式,相当于 Java 中的 default
- case 行尾必须为单词
-
案例:当命令行参数是 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)
- function 和
- 应用实例:计算输入两个参数的和 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" 的文件名称
定时维护数据库
需求分析
- 每天凌晨 2:10 备份数据库 test 到 /data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2018-03-12_230201.tar.gz
- 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除
思路分析
代码实现
- mysql_db_backup.sh
- 测试脚本
- 定时代码:
[键入指令] crontab -e [文件内容] 10 2 * * * /usr/sbin/mysql_db_backup.sh