shell编程进阶之路1

什么是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一起使用
-adiff预设只会逐行比较文本文件
-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)
-gtn1 大于 n2 (greater than)
-ltn1 小于 n2 (less than)
-gen1 大于等于 n2 (greater than or equal)
-len1 小于等于 n2 (less than or equal)

5.判定字符串的数据

参数含义
test -z stringzero判定字符串是否为 0 ?若 string 为空字符串,则为 true
test -n stringnozero判定字符串是否非为 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.任意多个空格转换为换行符
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值