一、shell简介
1.Shell是什么?
在计算机语言中,shell是指一种命令行解释器,是为用户和操作系统之间通信提供的一种接口(想象一下,若果没有一种与计算机沟通的方式,那么计算机如何得到来自人脑的指令呢),它接受来自用户输入的命令,并将其转化为一系列的系统调用送到内核执行,并将结果输入给用户。下图显示了shell在操作系统中的位置。
Shell分为两大类,一类是图形界面shell(Graphical User Interface),用户可以在GNOME桌面空白处单击鼠标右键,在弹出的菜单中单击Open terminal选项,打开shell。另一类是命令行式Shell(Command Line Interface),即CLI
事实上,Shell不只是一种解释器(在用户和系统间起着桥梁的作用),还是一种编程工具,称为脚本语言。与编译型语言(比如C/C++/Java等)不同,脚本语言又被称为解释型语言,这种语言经过编写后不需要做任何编译就可以运行。
2. Shell的功能是什么?
当一台系统运行起来时,内核会被调入内存中运行,由内核执行所有底层的工作,它会将所有应用程序及用户的操作翻译成CPU的基本指令,并将其送至处理器,这些过程听起来复杂,实际上也确实是非常底层和技术化的。为了对用户屏蔽这些复杂的技术细节,同时也是为了保护内核不会因用户直接操作而受到损害,有必要在内核之上创建一个层,该层就是一个“壳“,也就是shell名称的由来。
Bash Shell有两种工作模式,分别是互动模式和脚本模。 所谓互动模式就是由系统管理人员直接通过键盘输入命令,并等待其执行完毕后再执行下一条命令;而另一种模式是设计出一个脚本文件,将所有需要执行的命令写在该文件中,有Bash Shell读取并执行。很明显后一种工作模式的效率会更高,因为可以让工作变得“自动化“。
二、shell中常用的基本命令
1. diff命令
1. 命令格式
diff 命令是用来比较两个文件或目录的不同
diff [options] target1 target2
diff file1 file2文件
diff direcory1 directory2目录
2. diff在比较文件过程中结果读取方式、读取结果每一项的含义
[num1,num2][a|c|d][num3,num4]
num1,num2 表示在第一个文件中的行数
num3,num4 表示在第二个文件中的行数
a | 表示添加 ----add |
---|---|
c | 表示更改 ----change |
d | 表示删除 ----delete |
< | 表示第一个文件中的内容 |
---|---|
> | 表示第二个文件中的内容 |
— | 分割线 |
例如:
2,4c2,4 表示改变第一个文件的第二行和第四行才能匹配到第二个文件
3. diff在比较目录过程中结果的读取,读取结果每一项表示含义
Only in directroy/: filename
directory 表示在那个目录中
filename 表示在这个目录
4. diff中常用的参数说明
-b 或 --ignore-space-change | 不检查空格字符的不同 |
---|---|
-B 或 --ignore-blank-lines | 不检查空白行 |
-c | 显示全部内文,并标出不同之处 |
-i 或 --ignore-case | 不检查大小写的不同 |
-p | 若比较的文件为 C 语言的程序码文件时,显示差异所在的函数名称 |
-q 或 --brief | 仅显示有无差异,不显示详细的信息 |
-r 或 --recursive | 比较子目录中的文件 |
-u | 以合并的方式来显示文件内容的不同 |
具体实验如下所示:
diff file1 file2文件
diff direcory1 directory2目录
-b 或 --ignore-space-change 不检查空格字符的不同
-B 或 --ignore-blank-lines 不检查空白行
-c 显示全部内文,并标出不同之处
-i 或 --ignore-case 不检查大小写的不同
-p :若比较的文件为 C 语言的程序码文件时,显示差异所在的函数名称
-q 或 --brief :仅显示有无差异,不显示详细的信息
-u 以合并的方式来显示文件内容的不同
注意: -q和-c的不同之处再于-c更智能一些
2. patch命令
1. 命令格式
用于不同文件打补丁
命令格式 patch [options] file.old(旧文件) file.path(补丁文件)使用补丁文件来完善旧文件
2. 实验步骤如下:
yum install patch -y ##安装打补丁的软件
diff -u test.c test1.c > test.patch ##生成补丁文件 test.patch
patch test.c test.patch ##修补文件test.c
yum install patch -y ##安装打补丁的软件
diff -u test.c test1.c > test.patch ##生成补丁文件 test.patch
patch test.c test.patch ##修补文件test.c
3. cut命令(多用于字符截取)
cut -d | 指定分隔符 |
---|---|
cut -f 1,7/1-7 | 指定截取的列 |
cut -c 1,4 /1-4 | 指定截取的字符位置 |
实验操作如下:
首先拷贝/etc/passwd到/mnt下,如下所示:
cut -d(分隔符) : -f(列) 1(第一列) passwd
cut -d(分隔符) : -f(列) 1,4(1和4) passwd
cut -d(分隔符) : -f(列) 1-4(1到4) passwd
cut -c(位置) 2-4(2到4) passwd
cut -c(位置)2,4(2和4) passwd
4. sort命令(多用于字符排序)
sort -n | 纯数字排序 |
---|---|
sort -r | 倒序 |
sort -u | 去掉重复数字 |
sort -o | 输出到指定文件中 |
sort -t | 指定分隔符 |
sort -k | 指定要排序的列 |
实验操作如下:
首先编写一个脚本,脚本中写入一些数字,如下所示:
sort haha 仅对第一列数字排序
sort -n haha 对数字排序
sort -nr haha 对数字倒序排序
sort -nru haha 去掉重复的数字对数字倒序排序
sort -nru haha -o westos 指定排序结果到westos文件中
进入文件加入分隔符,再加一列数字如下所示:
sort -n haha 仅仅对分隔符前的数字进行排序
sort -t(指定分隔符) : -k(指定列) 2 -n haha
5. uniq命令(对重复的字符做相应的处理)
uniq -u | 显示唯一的行 |
---|---|
uniq -d | 显示重复的行 |
uniq -c | 每行显示一次并统计重复次数 |
实验步骤如下:
vim haha 进入文件删除一列和分隔符,如下所示:
sort n haha | uniq -c 每个数字只显示一次,并且显示出现的次数
sort n haha | uniq -d 显示重复的行并且进行排序
sort n haha | uniq -u 显示唯一的行并且排序
6. &&(条件为真)和||(条件为假)命令
&&命令:用来执行条件成立后执行的命令
||命令: 用来执行条件不成立后执行的命令
实验步骤如下:
ping -c1 -w1 172.25.254.12(真机,肯定通) && echo up
ping -c1 -w1 $1 &> /dev/null && echo yes || echo no如果成立就是yes,如果不成立就是no
注意:-c表示ping的次数,-w表示ping的等待时间
7. test命令(用来检测某个条件是否成立)
test命令(=和 == 均是相等的意思,与c语言不一样,c语言中 = 是赋值的意思,==是相等的意思)
test 命令 和 [ ] 等同,功能一样
test "$A" == "$B" 等同 [ "$A" == "$B" ]
[ "$A" = "$B" ] 相等
[ "$A" != "$B" ] 不相等
[ "$A" -eq "$B" ] 等于
[ "$A" -ne "$B" ] 不等于
[ "$A" -le "$B" ] 小于等于
[ "$A" -lt "$B" ] 小于
["$A" -ge "$B" ] 大于等于
["$A" -gt "$B" ] 大于
["$A" -ne "$B" -a "$A" -gt "$B" ] 与条件(必须条件都满足才成立)
["$A" -ne "$B" -o "$A" -gt "$B" ] 或条件(至少有一个条件满足才成立)
[-z "$A" ] 判断是否为空,空为真,非空为假
[-n "$A" ] 和条件相反就是真,非空为真,空为假
["file1" -ef "file2" ] 判断前后两个文件是否互相为硬链接
["file1" -nt "file2" ] 判断前面的硬链接是否与新
["file1" -ot "file2" ] 判断前面的硬链接是否旧
[-e "file" ] 判断文件是否存在
[-f "file" ] 判断文件是否为普通文件
[-L "file" ] 是否为软链接
[-S "file" ] 判断是否为套接字
[-b "file" ] 判断是否为块设备
[-d "file" ] 判断是否为目录
[-c "file" ] 判断是否为字符设备
实验步骤如下:
cd /mnt
ls
ln /mnt/haha /mnt/feng
[ "haha" -ef "feng" ] && echo yes || echo no
[ "/mnt/westos" -nt "/mnt/passwd" ] && echo yes || echo no
[ "/mnt/westos" -ot "/mnt/passwd" ] && echo yes || echo no
[ -e "/mnt" ] && echo yes || echo no
[ -e "/mnt/linux" ] && echo yes || echo no
[ -f "/mnt/" ] && echo yes || echo no
[ -f "/mnt/haha" ] && echo yes || echo no
ln -s ggg hhh
[ -L "hhh" ] && echo yes || echo no
yum install mariadb-server -y
systemctl start mariadb
ls -l /var/lib/mysql/mysql.sock
[ -S "/var/lib/mysql/mysql.sock" ] && echo yes || echo no
[ -b "/dev/vda" ] && echo yes || echo no
[ -d "/dev/vda" ] && echo yes || echo no
[ -d "/dev/" ] && echo yes || echo no
[ -c "/dev/pts/0" ] && echo yes || echo no
8. tr命令(大小写转换)
vim test.sh
echo $1 | tr 'a-z' 'A-Z'
sh test hello
vim test.sh
echo $1 | tr 'A-Z' 'a-z'
sh test.sh LOVE