shell理解
shell实质是一个解释器,我们所说的shell脚本就是运行在shell环境中能够按我们的意图去运行相应程序的一个文本记录,其中记录的是我们想让它做的事件,想做的事件可以用C、Python、Java等语言去开发,以下用的是Linux的命令去开发,让命令直接运行在shell中,即shell脚本
1.diff
基本用法:逐行对比不同
具体用法可用man diff查看
输出信息:
[num1,num2][a|c|d][num3,num4]
num1,num2 #第一个文件中的行
a #添加
c #更改
d #删除
< #第一个文件中的内容
> #第二个文件中的内容
num3,num4 #第二个文件中的行
常用参数:
-b #忽略空格
-B #忽略空行
-i #忽略大小写
-c #显示文件所有内容并标识不同
-r #对比目录
-u #合并输出
对比不同
法一:可以直接使用vimdiff命令,不同的地方会高亮显示出来,如下图:
法二:使用diff命令,如下图:
-u:合并输出,常用来输出补丁文件,打补丁的时候,文件未变的部分是不会动的,只会更改变了的部分,能够提高文件更新的速度。
2.patch
patch 原文件 补丁文件
-b #备份原文件
打补丁时需要先安装补丁软件,yum install patch
3.cut
主要用来截取数据
cut
-d : #指定:为分隔符
-f #指定显示的列 5第五列| 3,5 3和5列|3-5 3到5列|5- 第五列以后|-5 到第五列
-c #指定截取的字符(数字用法同-f)
练习:
ifconfig 网卡 可以显示此网卡的信息
显示信息中包含此网卡使用的ip地址
请用命令过滤此ip并在输出时只显示ip,其他信息不显示
参考答案:
(1). ifconfig ens160 | head -n 2 | tail -n 1|cut -c 14-26
(2). ifconfig ens160 | head -n 2 | tail -n 1|cut -d ' ' -f 10
(3). ifconfig ens160 | awk '/inet\>/{print $2}'
前三种方法单纯的输出ip,没有考虑到不输网卡时的清况
(4). 脚本编写
vim showip.sh
#!/bin/bash
[ -z "$1" ] && {
echo "please enter interface name"
exit
}
ifconfig $1 &> /dev/null || {
echo "$1 is not found!"
exit
}
ifconfig $1 | head -n 2 | tail -n 1 | cut -d " " -f 10
用法示例:
练习示例:
4.sort
sort
-n #纯数字排序
-r #倒叙
-u #去掉重复
-o #输出到指定文件
-t #指定分隔符
-k #指定排序的列
练习:
ls -l 目录 可以显示目录中所有文件案的属性
请按照文件大小进行排序并找出最大的2个文件并显示其名称
参考答案:
(1). ls -l| sort -t " " -k 5 -n|tail -n 2
(2). ls -S | head -n 2
练习:
5.uniq
-c #合并重复的并统计重复个数
-d #显示重复的行
-u #显示唯一的行
6.tr
tr 'a-z' 'A-Z' #小写转大写
tr 'A-Z' 'a-z' #大写转小写
7.test
作用:对比
test = [] #[]就相当于test命令
"test $a = $b" = [ "$a" = "$b" ]
test数字对比
= #等于
!= #不等于
-eq #等于
-ne #不等于
-le #小于等于
-lt #小于
-ge #大于等于
-gt #大于
test的条件关系
-a #并且
-o #或者
test对空的判定
-n #nozero 判定内容不为空
-z #zero 判定内容为空
test对于文件的判定
-ef #文件节点号是否一致(硬链接),即是否是同一个文件
-nt #文件1是不是比文件2新
-ot #文件1是不是比文件2老
-d #类型是不是目录
-S #套接字
-L #文件软链接
-e #文件是否存在
-f #普通文件
-b #块设备
-c #字符设备
练习:
编写脚本完成以下条件
file_check.sh 在执行时
如果脚本后未指定检测文件报错“未指定检测文件,请指定”
如果脚本后指定文件不存在报错“此文件不存在”
当文件存在时请检测文件类型并显示到输出中
参考答案
(1).脚本一
注意该方法中,对于链接的判定必须放到对于文件的判定之前
#!/bin/bash
[ -z "$1" ] && {
echo "please enter filename!"
exit
}
[ -e "$1" ] || {
echo "$1 is not exist !"
exit
}
[ -L "$1" ] && {
echo "$1 is a link"
exit
}
[ -f "$1" ] && {
echo "$1 is a common file!"
exit
}
[ -d "$1" ] && {
echo "$1 is a directory!"
exit
}
(2).脚本二
注意该方法没有顺序要求,但是需要将后面判定条件都执行一遍,效率没有脚本一的高
#!/bin/bash
[ -z "$1" ] && {
echo "please enter filename!"
exit
}
[ -e "$1" ] || {
echo "$1 is not exist !"
exit
}
TYPE=$(ls -ld $1 | cut -c 1)
#echo $TYPE
[ "$TYPE" = "-" ] && echo $1 is a common file
[ "$TYPE" = "l" ] && echo $1 is a link
[ "$TYPE" = "s" ] && echo $1 is a socket
[ "$TYPE" = "d" ] && echo $1 is a directory
[ "$TYPE" = "c" ] && echo $1 is a char
[ "$TYPE" = "b" ] && echo $1 is a block
test数字对比:
test的条件关系:
test对空的判定:
test对文件的判定:
8.&& 和 ||
&& 符合条件作动作
|| 不符合条件作动作
结束!!!