12-Shell(2)
流程控制#
case#
-
基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; // …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
-
注意事项
- case 行尾必须为单词
in
,每一个模式匹配必须以右括号)
结束 - 双分号
;;
表示命令序列结束,相当于 Java 中的 break - 最后的
*)
表示默认模式,相当于 Java 中的 default
- case 行尾必须为单词
for#
- 基本语法
for 变量 in 值1 值2 值3 … do 程序 done ····································· for (( 初始值;循环控制条件;变量变化 )) do 程序 done
- 案例
while#
读取控制台输入#
Shell 函数#
Shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。
系统函数#
系统函数中,我们这里就介绍如下这俩。
basename
- 功能:返回完整路径最后 / 之后的部分,常用于获取文件名
- 基本语法
basename [pathname] [suffix]
basename [string] [suffix]
- 选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉
dirname
- 基本语法:
dirname 文件绝对路径
- 功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。简单来说,就是返回完整路径最后一个 / 前面的部分。常用于返回路径部分
自定义函数#
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]*----- 匹配一个任意字母字符串
示例
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 天前备份的数据库文件,如果有就将其删除
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?