linux之Shell 基本知识

一、脚本概述

 1.Shell脚本是一种解释型语言

 2.用Shell脚本保存执行命令

 3.用脚本判定命令的执行条件

 4.用脚本实现命令的批量执行

二、脚本基础知识

1.脚本编写

  #!/bin/bash    ##执行脚本的shell类型

2.脚本运行

sh file.sh    ##用sh打开脚本
chmod  +x file.sh   ##添加执行权限
/mnt/file.sh    ##用脚本本身的shell打开

这里写图片描述
这里写图片描述
3.脚本调试

sh -x file.sh    
+ echo hello    ##命令行
hello           ##运行结果

这里写图片描述
4.自动添加脚本信息说明

编辑配置文件 /etc/vimrc
"map <F4> ms:call Westos()<cr>'s    ##按F4自动添加信息Westos函数  (" 表示注释)
autocmd BufNewFile   *.sh,*.script  exec ":call Westos()" ##以.sh .script结尾的文件编辑时自动添加文本信息
func Westos()
        call append(0,"##############################")
        call append(1,"# Author         :           #")
        call append(2,"# Date           :".strftime("%Y-%m-%d").(" #"))
        call append(3,"# Mail            :           #")
        call append(4,"# Version         :           #")
        call append(5,"# Description    :           #")
        call append(6,"#                            #")
        call append(7,"##############################")
        call append(8,"")
        call append(9,"#!/bin/bash")
        call append(10,"")
endfunc

这里写图片描述
这里写图片描述

三、基本脚本命令

1.diff ##比较文件差异

1.对比两个文件的不同

diff -q file1 file2
文件 file1 和 file2 不同
diff -c file1 file2  ##列出不同
diff -r  westos1 westos2  ##比较两个目录的区别
只在 westos2 存在:westos2
diff file1 file2
2,3c2,3  ##改变file1的2,3才能匹配file2的2,3
< 123    ##第一个文件的第二行
<        ##第二个文件的第三行
---
> 456    ##第二个文件的第二行
> 111    ##第二个文件的第三行

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2.生成补丁

diff -u file1 file2    ##生成补丁
diff -u file1 file2 > file.path  ##将补丁保存在file.path中

这里写图片描述

patch
 (1).安装补丁软件 patch.x86_64
 (2).打补丁
  patch file1 file.path   ##给file1加入补丁-->变成file2

这里写图片描述
3.打补丁的同时对原文件备份(.orig)

  patch file1 file.path -b  
  cat file1.orig     ##备份的原file1

这里写图片描述

2.cut ##多用于截取字符

1.cut参数

  cut  -d      ##指定分隔符
  cut  -f  1  ##指定截取每行第1列字段
  cut  -c  3  ##指定截取每行第3个字符

2.示例应用

cut -d : -f 1-3 passwd   ##以:为分隔符截取1-3列字段的信息
cut -d : -f 1 passwd     ##以:为分隔符截取第一列字段的信息
cut -c  1-3 passwd       ##截取第1-3字符信息

这里写图片描述
这里写图片描述

grep bash /etc/passwd | cut -d : -f 1  ##显示可以登陆的用户信息
ifconfig eth0 | head -n 2 | tail -n 1| cut -d " " -f 10  ##显示主机ip

这里写图片描述
3.sort ##多用于字符排序

  • sort参数
 sort -n   ##纯数字排序                              sort -r     ##倒序
 sort -u   ##去掉重复数字                          sort -o    ##输出到指定文件中
 sort -t   ##指定分割符                                sort -k   ##指定要排序的列
sort -n file    ##正序输出
sort -rn file   ##倒序输出
sort -rnu file  ##倒序输出不显示重复的个数
sort -rn file | uniq -c ##倒序输出并输出个数
sort -n file -o file1  ##正序排列保存在file1中

这里写图片描述
这里写图片描述
2.对mnt文件排序,找出最大的两个文件

ll | sort -t " " -k 5 -rn | head -n 2  ##显示/mnt中的最大的两个文件

这里写图片描述

4.uniq ##对重复字符的处理

  • uniq参数
  uniq  -u   ##显示唯一的行
  uniq  -d   ##显示重复的行
  uniq  -c   ##每行显示的次数

##注意:配合sort命令使用

sort -n file | uniq -u   ##正序并显示只出现过一次的数字
sort -n file | uniq -d   ##正序并显示重复的行
sort -n file | uniq -c   ##正序并显示出重复的次数

这里写图片描述

5.&&和||

 1.&& 用来执行条件成立后执行的命令
 2.|| 用来执行条件不成立后执行的命令

显示ping其他主机的结果

ping -c1 -w1 172.25.254.16   ##ping一次
ping -c1 -w1 172.25.254.16 && echo yes || echo no
ping -c1 -w1 172.25.254.16 &> /dev/null && echo yes || echo no
yes

这里写图片描述

6.test ##判断条件是否成立

  1. test 参数
 test  等同于   [  ]

字符型数据

 [ "$a" = "$b" ]     ##$a和$b是否一致
 [ "$a" != "$b" ]    ##$a和$b是否不一致
 [ ! "$a" = "$b" ]   ##$a和$b是否一致,且该条件不成立时

这里写图片描述
整型数据

 [ "$a"  -eq  "$b" ]    ##是否$a = $b
 [ "$a"  -ne  "$b" ]    ##是否$a != $b
 [ "$a"  -lt  "$b" ]    ##是否$a < $b
 [ "$a"  -le  "$b" ]    ##是否$a <= $b
 [ "$a"  -gt  "$b" ]    ##是否$a > $b
 [ "$a"  -ge  "$b" ]    ##是否$a >= $b

这里写图片描述

 [ "$a" = "$b"  -o  "$a"  -lt  "100" ]  ##$a是否等于$b,或者$a小于100
 [ "$a" = "$b"  -a "$a"  -gt  "100" ]  ##$a是否等于$b,并且$a大于100

这里写图片描述

 [ -z  "$a" ]   ##$a是否为空
 [ -n  "$a" ]   ##$a是否不为空

这里写图片描述
文件

[ "file1"  -ef  "file2" ]   ##节点是否一致,即文件是否一样
[ "file1"  -nt  "file2" ]   ##file1是否比file2时间new
[ "file1"  -ot  "file2" ]   ##file1是否比file2时间out
[ -e  "file" ]   ##文件是否存在
[ -f  "file" ]   ##是否是普通文件
[ -L  "file" ]   ##是否是软链接文件
[ -S  "file" ]   ##是否是套接字
[ -b  "file" ]   ##是否是块设备
[ -d  "file" ]   ##是否是目录
[ -c  "file" ]   ##是否是字符文件

2.判断数字是否在0-10之间

[ $1 -gt "0" -a $1 -lt "10" ] && echo yes || echo no

这里写图片描述
3.编写脚本clean_log.sh,当超级用户时,清空日志,当普通用户,提示请切换用户

User_Id=`id -u`
[ "$User_Id" -eq "0" ]&& `> /var/log/messages` || echo You are not root!!

4.编写脚本check_file.sh判断文件类型

vim /mnt/file.sh
#!/bin/bash
[ ! -e "$1" ]&&{
        echo  $1 is not exit!!
        exit
}
[ -b "$1" ]&&{
        echo $1 is a block device!!
        exit
}
[ -f "$1" ]&&{
        echo $1 is a common file
        exit
}

运行脚本:

sh file.sh  /etc/passwd
/etc/passwd is a common file

这里写图片描述
这里写图片描述

7.find ##查找文件

1.find 参数

 -group   ##查找组
 -type    ##查找类型
 -user    ##查找用户
 -not   -group  ##查找不是该组的文件
 -a  |  -o      ##  and  |  or
 -perm  777    ##精确匹配权限777的文件
 -perm  -644   ##匹配u=6、g=4、o=4的文件
 -perm  /666   ##匹配u=6或g=6或o=6的文件
 -size  20k    ##查找文件大小为20k的文件
 -size  -20k   ##查找文件大小为小于20k的文件
 -size  +20k   ##查找文件大小为大于20k的文件
 -maxdepth  1  -name  passwd   ##查找目录的深度为1层
 -mindepth  2  -maxdepth  2  -name  passwd   ##只查找目录的第2层

这里写图片描述
注意:最大深度为2层

8.tr ##转换字符

cat /mnt/test   --   123412
tr '1-2' 'a-b' < /mnt/test   ---ab34ab
tr 'a-z' 'A-Z' < /mnt/test   ---小写变成大写
tr '3' '#' < /mnt/test    ---3#

这里写图片描述

三、简单脚本练习

1.运行脚本 ip_show.sh 显示当前主机ip
ifconfig eth0 | head -n 2 | tail -n 1 | cut -d " " -f 10

这里写图片描述
这里写图片描述

 2.运行脚本 user_show.sh 显示当前主机可登陆的用户
 grep -E "bash$|tcsh$|sh$|csh$" /etc/passwd | cut -d : -f 1

这里写图片描述

 3.运行脚本 clear_log.sh 清空当前日志
 USER=`whoami`
[ "$USER" = "root" ]||{
        echo -e "Please run this script with root!"
        exit
}&&{
        rm -fr /var/log/messages /var/log/secure /var/log/maillog
        touch /var/log/messages /var/log/secure /var/log/maillog
        echo -e "cleared log files"
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_37048504/article/details/81944501