1. 什么是Shell(计算机壳层)
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)
它类似于DOS下的command.com和后来的cmd.exe,它接收用户命令,然后调用相应的应用程序
同时它又是一种程序设计语言,作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令
作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支
在排序算法中,Shell是希尔排序的名称
简单来说,shell就是用户和系统交互的工具
- 1
- 2
- 3
- 4
- 5
- 6
1. 脚本是一种解释型语言
2. 用shell脚本来保存执行动作
3. 用脚本判定命令的执行条件
4. 用脚本来实现动作的批量执行
- 1
- 2
- 3
- 4
文字操作系统与外部最主要的接口就叫做shell,shell是操作系统最外面的一层
shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果
shell提供了你与操作系统之间通讯的方式,这种通讯可以:
以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行
shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用
本质上,shell script是命令行命令简单的组合到一个文件里面
Shell是一个命令解释器,类似于DOS下的command
它接收用户命令(如ls等),然后调用相应的应用程序,较为通用的shell有标准的Bourne shell (sh)和C shell (csh)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2. Shell的分类
- 图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell
其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE
- 1
- 2
- 命令行式shell(Command Line Interface shell ,即CLI shell)
例如:bash / sh / ksh / csh(Unix/linux 系统)(MS-DOS系统)
cmd.exe/ 命令提示字符(Windows NT 系统)
Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)
- 1
- 2
- 3
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell
交互式模式就是shell等待你的输入,并且执行你提交的命令,这种模式被称作交互式是因为shell与用户进行交互
这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退,当你签退后,shell也终止了
shell也可以运行在另外一种模式:非交互式模式
在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们,当它读到文件的结尾,shell也就终止了
也就是一个自动执行的脚本
- 1
- 2
- 3
- 4
- 5
3. shell 脚本中的常用命令
3.1. diff命令
diff 命令是用来比较两个文件或目录的不同
格式:diff [options] target1 target2
diff file1 file2 #比较两个文件的不同之处
diff dir1 dir2 #比较两个目录的不同之处
- 1
- 2
- 3
- 4
diff 命令是用来比较两个文件或目录的不同,并且是以行为单位来比对的,一般是用在 ASCII 纯文本文件的比对上
由于是以行为比对的单位,因此, diff通常是用在同一文件(或软件)的新旧版本差异上对比上,能够借由diff创建的分析档,以处理补丁(patch)功能的文件
- 1
- 2
[num1,num2][a(add 添加)|c(change 更改)|d(delete 删除)][num3,num4]
num1,num2 表示在第一个文件中的行数
num3,num4 表示在第二个文件中的行数
- 1
- 2
- 3
< 表示第一个文件中的内容
> 表示第二个文件中的内容
- 1
- 2
1,2c1,2 表示改变第一个文件中的第1行和第2行才能匹配第二个文件(表示第一个文件和第二个文件的不同之处在于第1行和第2行)
- 1
Only in directroy/: filename #只有directroy这个目录有filename这个文件
directory 表示在这个目录中
filename 表示在这个目录的文件
- 1
- 2
- 3
diff中常用的参数:
参数 | 说明 |
---|---|
-b或–ignore-space-change | 不检查空格字符的不同 |
-B或–ignore-blank-lines | 不检查空白行 |
-c | 显示全部内容,并标出不同之处 |
-i或–ignore-case | 不检查大小写 |
-q或–brief | 仅显示有无差异,不显示详细的信息 |
-r或–recursive | 比较子目录中的文件 |
-u,-U<列数>或–unified=<列数> | 以合并的方式来显示文件内容的不同 |
实验准备:在desktop虚拟机中做实验
配置好desktop的yum源
修改主机名:shell.westos.com
实验步骤:
首先切换到/mnt目录下,ls #查看发现/mnt下并没有文件,编辑一个名称为westos1的文件
在/mnt/westos中写入:
hello westos
- 1
- 2
cat westos1 > westos2
#为了方便,将westos1的文件的内容复制一份到westos2,修改westos2
在/mnt/westos中写入:
hello westos
123
- 1
- 2
- 3
通过比较差异,可以看到,以westos1为标准,a表示追加,这句话的意思是westos1文件的第2行添加内容123,就与westos2文件内容相匹配
将westos2与westos1调换顺序,可以看到,以westos2为参考,d表示删除,意思是给第二行删掉123则与westos1文件相同
在westos2文件第一行最后加一个空格
可以看到,westos1文件的第一行添加123,就和westos1一致,说明不检查空格字符
编辑westos1文件,写入内容:hello westos 在下方加两行空行
编辑westos1文件,写入内容:hello westos 在下方不加空行
可以看到,不检测空白行(这个实验需要保持其他内容都一致,只有空白行内容不同,否则会将包括空白行的不同的信息全部显示出来)
vim westos1,编辑westos1文件
将westos1文件的内容传给westos2文件
在westos2文件中第二行加入123
diff -c #显示全部内容,并标出不同之处
可以看到,感叹号所在的行就是标出的不同之处,其他信息一致
建立两个目录,分别是westos和lee
touch westos/hello #在/mnt/westos目录下建立hello文件
比较/mnt/westos与/mnt/lee的子目录文件的不同
可以看到,命令运行的结果是只有在/mnt/westos/中有hello文件
diff -u #以合并的方式来显示文件内容的不同
可以看到,westos1文件和westos2文件第一三行内容一致,合并显示,第二行内容不同,分开显示
diff -q #仅显示有无差异,不显示详细的信息
编辑westos2文件
将hello的小写h变成大写
diff -i #不检查大小写
检测两文件的异同,生成westos.path补丁文件
3.2. patch:用于不同文件打补丁
使用yum源安装打补丁软件patch
安装成功
patch [options] file.old.file.path -b
patch -b westos1 westos.path
#补丁修复westos1文件
查看westos1文件和westos2文件有无异同
可以看到,westos1和westos2完全相同
在当前环境中,ls可以看到,保存有westos1.orig文件,还有westos.path补丁文件
3.3 cut截取命令
cut的作用:连接文件并打印到标准输出设备上,多用于字符截取
cut -d:指定字段的分隔符,默认的字段分隔符为“TAB”;
cut -f 1,7|1-7:显示指定字段的内容,指定截取的列;
cut -c 1,4|1-4:仅显示行中指定范围的字符,指定截取的字符位置
- 1
- 2
- 3
- 4
实验要求:仅显示虚拟机eth0网卡的ip
方法1:以ifconfig eth0的输出作为输入,以空格为分隔符,截取第十列列,再取第二行,就可以看到eth0的ip了
方法2:以ifconfig eth0的输出作为输入,截取14-27列,再取第二行,就可以看到eth0的ip了
方法3
ifconfig eth0 | awk '/inet\>/{print $2}'
#以inet作为关键字,inet后边不能有内容,打印第二列
将/etc/passwd文件复制到当前目录
查看passwd文件
可以看到passwd文件中保存的内容cut -d : -f 1 passwd
#以:作为分隔符查看第一列
cut -d : -f 1-4 passwd
#以:作为分隔符查看第1列到第4列
3.4 sort排序命令
sort的作用:将文件进行排序并输出,多用于字符排序
-n:纯数字排序,依照数值的大小排序;
-r:倒序排序;
-u:去掉重复数字;
-t<分隔字符>:指定排序时所用的栏位分隔符;
-k:指定排序第几列;
-o<输出文件>:将排序后的结果存入制定的文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.5 uniq命令
uniq命令的作用:用于报告或忽略文件中的重复行(一般与sort命令结合使用)
-u或——unique:仅显示出现一次的行
-d或--repeated:仅显示重复出现的行列
-c或——count:在每列旁边显示该行重复出现的次数
- 1
- 2
- 3
- 4
实验题目:将所有/etc/*.conf 文件中cpu使用率前五名的名称显示出来
实验步骤:
将/etc/*.conf 文件复制一份到/mnt目录中
ls #查看复制的所有的以.conf结尾的文件
ls -l #查看文件的属性
方法1:
方法2:ls -S | head -n 5
#从大到小显示文件大小,取前五个输出
3.6 test测试命令
test:shell环境中测试条件表达式工具
test 表达式1 –a 表达式2 #两个表达式都为真
test 表达式1 –o 表达式2 #两个表达式有一个为真
- 1
- 2
- 3
test –n 字符串 #字符串的长度非零
test –z 字符串 #字符串的长度是否为零
test 字符串1=字符串2 #字符串是否相等,若相等返回true
test 字符串1!=字符串2 #字符串是否不等,若不等反回false
- 1
- 2
- 3
- 4
test File1 –ef File2 两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode
test File1 –nt File2 判断文件1是否比文件2新
test File1 –ot File2 判断文件1比是否文件2旧
[ –b file ] #文件是否块设备文件
[ –c File ] #文件是否字符设备文件
[ –d File ] #文件是否是目录
[ –e File ] #文件是否存在(常用,一般写在-z后)
[ –f File ] #文件是否为普通文件 (常用)
[ –b File }#文件存在并且是块设备文件
[ –L File ]#文件是否是一个软链接(同-h,一般写在-f前)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
实验题目:写一个判断文件类型的脚本
实验步骤:
编写check_file.sh脚本文件
写入判断条件和输出(-L要写在-f之前,因为链接肯定是一个普通文件)
运行脚本,进行测试
当脚本名称后不加文件名,则显示要求输入文件名
当脚本名称后的文件名是一个目录,则输出其文件名是一个目录
当脚本名称后跟一个不存在的文件,则显示该文件不存在
当脚本名称后面跟一个已经存在的普通文件,则显示该文件是一个普通文件
制作一个链接, /mnt/file必须存在
ls #查看链接形成
运行脚本,则显示该文件是一个软链接
来源:CSDN
作者:阿然A
链接:https://blog.csdn.net/weixin_45029822/article/details/104214731