shell编程
什么是shell?
关于shell,通常情况下,有两种理解。
一、shell程序
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
shell 是操作系统中的一个软件。故名思议,shell“壳”,它包在 linux 内核的外面,为用户和内核之间的交互提供了一个接口。
系统中的命令用 shell 去解释shell 接收系统回应的输出并显示其到屏幕中。
- bash = GNU Bourne-Again-Shell
二、shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本,但要知道,shell 和 shell script 是两个不同的概念。 由于习惯的原因,简洁起见,这里出现的"shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。
这里常说的shell编程都是指shell脚本,不同于编译性语言,脚本是一种解释性语言。
脚本能干什么?
- 我们用shell脚本保存执行动作
- 用脚本判定命令的执行条件
- 用脚本来实现动作的批量执行
小型shell脚本的典型开发周期
首先,直接在命令行上测试;
然后,一旦找到能够独立完成工作的语法,再将他们组合放到一个独立的脚本里,并为该脚本设置执行的权限;
之后就能只直接使用改脚本。
关于脚本字体颜色设置
shell学习方法
我们计划以以下的方式学习shell:
1.命令的含义以及对应的参数;
2.用命令进行具体的示例加深印象;
3.解决一个实际问题。
因为我们终归需要落实到具体问题上,否则我们的学习将毫无意义!
那么,我们就此开启我们的shell学习之旅吧~
diff
命令含义及常用参数
定义:比较给定的两个文件或目录的不同。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
参数 | 含义 |
---|---|
-<行数> | 指定要显示多少行的文本。此参数必须与-c或-u一起使用 |
-a | diff预设只会逐行比较文本文件 |
-b | 不检查空格字符的不同 |
-B | 不检查空白行 |
-c | 显示全部内容,并标出不同之处 |
-i | 不检查大小写的不同 |
-p | 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称 |
-q | 仅显示有无差异,不显示详细的信息 |
-r | 比较子目录中的文件 |
-u | 以合并的方式来显示文件内容的不同 |
示例
注意:上面的命令执行后,会将比较后的不同之处以指定的形式列出,如下所示:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
其中,字母"a"、“d”、“c"分别表示添加、删除及修改操作。而"n1”、"n2"表示在文件1中的行号,“n3”、"n4"表示在文件2中的行号。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1,以>开始的行属于文件2。
- 我们在file1加入一些空格
- 我们在file1中添加以行空白行
file1:file2: - 我们分别修改file1、file2内容为大小写不同的单词:
patch打补丁
上面我们讲了用diff比较两个文件的不同,那么如何通过打补丁使文件相同呢?
1.首先,将diff -u 的内容输出重定向到一个新的文件
2.yum install patch -y
3.
cut
命令含义及参数
含义:命令多用与字符截取。
一般有两种用法:
- 在每个文件的各行中, 把提取的片断显示在 标准输出。
- 其二是连接两个或多个文件,如cut f1 f2 > f3将把文件f1和f2的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。
参数 | 含义 |
---|---|
-d | 指定分隔符 |
-f | 指定截取的列 |
-c | 仅显示行中指定范围的字符 |
指定字段的字符或者字节范围
cut命令可以将一串字符作为列来显示,字符字段的记法:
N-:从第N个字节、字符、字段到结尾;
N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。
N,M:第N个字节、字符、字段和第M个字节、字符、字段。
示例
为了方便,我们使用/etc/passwd的内容作为练习。
sort
多用于字符排序
参数 | 含义 |
---|---|
sort -n | 纯数字排序 |
sort -r | 倒序 |
sort -u | 去掉重复数字 |
sort -o | 输出到指定文件中 |
sort -t | 指定分隔符 |
sort -k | 指定要排序的列(默认是第一列排序) |
sort -b | 忽略每行前面开始出的空格字符 |
sort -c | 检查文件是否已经按照顺序排序 |
sort -d | 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 |
sort -f | 排序时,将小写字母视为大写字母 |
示例
先创建一个test的文本,里面输入相关的数字。
uniq
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
参数 | 含义 |
---|---|
uniq -u | 显示唯一的行 |
uniq -d | 显示重复的行 |
uniq -c | 每行显示一次并统计重复次数 |
示例
解决实际问题
-
Q:找出哪个ip登录本机次数最多?
-
A:我可以使用last -i对登录主机的记录进行查看
或者使用egrep -v 反向过滤掉一些不需要的内容
-
Q:写个脚本,测试ip是否通
test(等价于[ ])
test 命令最短的定义可能是评估一个表达式:如果条件为真,则返回一个 0 值;如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。
参数与示例
1.关于某个文件名的『类型』侦测(存在与否),test -e filename
参数 | 含义 |
---|---|
-e | 该『文件名』是否存在?(常用) |
-f | 该『文件名』是否为文件(file)?(常用) |
-d | 该『文件名』是否为目录(directory)?(常用) |
-b | 该『文件名』是否为一个 block device ? |
-c | 该『文件名』是否为一个 字符设备? |
-S | 该『文件名』是否为一个 Socket 文件? |
-p | 该『文件名』是否为一个 FIFO (pipe) 文件? |
-L | 该『文件名』是否为一个软链接? |
可以通过打印$?检测是否为真(存在)。也可以通过&&和| | 进行判断。
2.关于文件的权限侦测,如 test -r filename
参数 | 含义 |
---|---|
-r | 侦测该文件名是否具有『可读』的属性? |
-w | 侦测该文件名是否具有『可写』的属性? |
-x | 侦测该文件名是否具有『可执行』的属性? |
-u | 侦测该文件名是否具有『SUID』的属性? |
-g | 侦测该文件名是否具有『SGID』的属性? |
-k | 侦测该文件名是否具有『Sticky bit』的属性? |
-s | 侦测该文件名是否为『非空白文件』? |
3.两个文件之间的比较,如:test file1 -nt file2
参数 | 含义 |
---|---|
-nt | (newer than)判断 file1 是否比 file2 新 |
-ot | (older than)判断 file1 是否比 file2 旧 |
-ef | 判断 file2 与 file2 是否为同一文件,可用在判断 hard link(硬链接) 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode 里! |
关于软硬连接,请看这篇文章。
4.关于两个整数之间的判定,例如 test 1 -eq 2
参数 | 含义 |
---|---|
-eq | 两数值相等 (equal) |
-ne | 两数值不等 (not equal) |
-gt | n1 大于 n2 (greater than) |
-lt | n1 小于 n2 (less than) |
-ge | n1 大于等于 n2 (greater than or equal) |
-le | n1 小于等于 n2 (less than or equal) |
5.判定字符串的数据
参数 | 含义 |
---|---|
test -z string | zero判定字符串是否为 0 ?若 string 为空字符串,则为 true |
test -n string | nozero判定字符串是否非为 0 ?若 string 为空字符串,则为 false。(-n 亦可省略) |
test str1 = str2 | 判定 str1 是否等于 str2 ,若相等,则回传 true |
test str1 != str2 | 判定 str1 是否不等于 str2 ,若相等,则回传 false |
6.多重条件判定,例如: test -r filename -a -x filename
参数 | 含义 |
---|---|
-a | (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。 |
-o | (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。 |
! | 反状态,如 test ! -x file ,当 file 不具有 x 时,回传 true |
解决实际问题
- Q:当/目录使用率超过30% 每分钟检测一次 在/var/log/messages下显示
- A:我们需要秉承着分模块进行,实现一部分测试一下,看是否成功。
- Q:判断脚本后输入的ip是否为空,如果为空,则要输出提示,并退出执行;输入不为空则执行相关判断。
- A:
tr(转换)
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
参数 | 含义 |
---|---|
-c | 首先补足SET1 |
-d | 删除匹配SET1 的内容,并不作替换 |
-s | –squeeze-repeats 如果匹配于SET1 的字符在输入序列中存在连续的重复,在替换时会被统一缩为一个字符的长度 |
-t | 先将SET1 的长度截为和SET2 相等 |
示例
1.大小写转换
2.任意多个空格转换为换行符