从第一人称的角度去带你了解Shell脚本的编写过程及思路

15 篇文章 0 订阅

前言:

最近有朋友拿了两个文本给我,里面全都是IP地址,第一个IP地址是已安装相关服务的主机地址,第二个地址则是某一区域的所有主机IP地址,其中第一个文本有部分内容与第二个文本的内容重复(说明是已经安装了的),而第一个文本除了包含第二个文本的部分内容外,还包含了其他的内容,需要解决的问题就是找出第二个文本中不存在于第一个文本的内容(也就是没有安装相关服务的主机)

一、场景模拟

公司拥有三个机房,近期需要对所有主机安装某个软件,现在项目进行到一半,A机房已经安装完成了一半,B机房也完成了一半,C机房全部完成。现在有一份已安装软件的主机的IP列表信息,但是IP杂乱无章且没有备注,现在需要找出所有没有安装软件的主机IP,而这些IP可能在A机房,也可能在B机房,下面做个角色解释。

1.1、角色扮演

  • a.txt=A机房所有IP
  • b.txt=B机房所有IP
  • c.txt=C机房所有IP
  • installed.txt=所有已安装的主机IP

1.2、角色戏份(文本内容)

 

a.txt

root@debian:~# cat a.txt
192.168.1.2
baidu.com
10.5.6.8

b.txt

root@debian:~# cat b.txt
172.14.6.8
112.31.0.9
192.168.3.2

c.txt

root@debian:~# cat c.txt
192.168.4.56
114.34.35.36

installed.txt

root@debian:~# cat installed.txt
192.168.4.56
114.34.35.36
112.31.0.9
baidu.com

1.3、需求

在a.txt、b.txt中找出不存在于installed.txt中的IP地址

二、解决思路

  • 1、使用轮询的方式分别查看分布机房的IP列表信息

  • 2、每查看一个分布机房的IP就与installed.txt文件进行内容强制对比

  • 3、一旦匹配成功,就判断该IP是已经安装的,此时把它打印出来,并定向追加到一个文件(ied_save.txt)
  • 4、匹配失败则表示该IP没有安装,此时把IP及所在文件信息打印出来,并定向追加到一个文件(not_save.txt)

三、解决步骤

对于数据对比,脚本要灵活应对,相关使用方法要设置提示,下面从脚本第一步开始讲解

3.1、设置文件、字体变量

为了后期脚本编写更加方便,所以事先设置相关文件为变量,然后在后面需要用到相关文件的时候就直接调用变量即可,

另外为了使脚本提示信息更加直观,所以需要配置两种主要字体效果,分别是绿色(校验通过)+红色(警告),由于这两个内容都是一定要生效的,所以就直接写在前面,不需要封装函数,具体内容如下:

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置
ied='IP/save_installer.log'
not='IP/save_not_install.log'
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'

3.2、 设置打印效果函数

因为后期需要用到很多信息打印输出,所以把需要多次使用的功能封装成一个函数,需要用到的时候就调用,通过传参的方式实现特定信息的提示(打印),增加内容如下:

这里的打印语句全部都是采用变量的方式去实现,${1}则是传入的参数,其他变量是颜色的设置参数

#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}

 叠加效果如下:

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'

##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}

然后添加一些测试内容去执行看看效果

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
print_red_bg "红色背景"
print_green_bg "绿色背景"
print_red_zt_green_zt "红字体" "绿字体"

执行效果

3.3、帮助信息

通过检测一参内容及无参情况下打印脚本使用帮助信息,内容如下:

#帮助信息
if [[ "$1" -eq 'help' || "$1" -eq '--help' || "$1" -eq "-h" || "$1" -eq "?" || -z "$1" ]];then
    print_red_zt_green_zt "程序描述:" "IP对比分析脚本"
    print_red_zt_green_zt "版本信息:" "V1.0(多线程版)"
    print_green_bg "使用帮助:" 
    print_red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
   print_red_zt_green_zt "例如:" " installed.txt"
    print_red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
    print_red_zt_green_zt "例如:" "a.txt b.txt"    
    print_red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
    exit 1
fi

叠加效果如下:

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
#帮助信息
if [[ "$1" -eq 'help' || "$1" -eq '--help' || "$1" -eq "-h" || "$1" -eq "?" || -z "$1" ]];then
    print_red_zt_green_zt "程序描述:" "IP对比分析脚本"
    print_red_zt_green_zt "版本信息:" "V1.0(多线程版)"
    print_green_bg "使用帮助:" 
    print_red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
   print_red_zt_green_zt "例如:" " installed.txt"
    print_red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
    print_red_zt_green_zt "例如:" "a.txt b.txt"    
    print_red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
    exit 1
fi

执行效果如下:

此时,帮助信息完成了。

3.4、判断文件数量/是否存在

因为我们不确定会传入多少的文件,所以要使用遍历的方法对每一个变量进行判断,这时候需要用到两个特殊变量:

$* #表示所有变量值的内容
$# #表示传入的变量数量[整数]

表示一次显示所有变量值,然后配合for循环就可以遍历传入的所有变量了。

3.4.1、文件检查函数

设置文件检查函数的主要作用是在不同的流程中需要对相关文件进行判断,判断文件是否存在,文件是否为空,如果存在要不要删除,如果为空代表什么,这些后期都需要判断,下面是脚本的主要功能点解析:

第一个if判断:通过一参判断文件是否存在【也就是-f 的判断】,在第一个判断中,会出现两种情况,第一种是存在,第二种是不存在

#判断文件是否存在
if [[ -f "${1}" ]];then
    $执行对应语句
else
    $执行对应语句
fi

第二个判断【在第一个判断存在的情况下的第一个判断】:如果二参传入的值是2,那么就表示这个文件是建议删除的【所以这个情况需要再次判断】,否则就是希望存在的

#判断文件是否存在
if [[ -f "${1}" ]];then
    #判断二参文件是否要删除
    if [[ "${2}" == "2" ]];then
            $执行对应语句
    else
            $执行对应语句
    fi
else
    $执行对应语句
fi

第三个判断【文件存在,且传入的值为2的情况下的判断】:设置对话输入,如果用户输入的是Y[无论大小写]那就删除一参这个文件,否则跳过[程序应以默认数据保留为主,避免造成不必要的数据丢失]

#判断文件是否存在
if [[ -f "${1}" ]];then
    #判断文件是否需要删除
    if [[ "${2}" == "2" ]];then
        print_red_bg "文件:${1}存在,是否删除[y/n]"
        read rmd	
        #判断用户是否选择删除该文件
        if [[ "$rmd" == "y" || "$rmd" == "Y" ]];then
            #删除文件
            rm -f $1
        fi
    else
            $执行对应语句
    fi
else
    $执行对应语句
fi
	

第四个判断【如果文件存在的情况下】:如果二参等于3,那么就判断这个文件内容是否为空

#判断文件是否存在
if [[ -f "${1}" ]];then
    #判断文件是否需要删除
    if [[ "${2}" == "2" ]];then
        print_red_bg "文件:${1}存在,是否删除[y/n]"
        read rmd	
        #判断用户是否选择删除该文件
        if [[ "$rmd" == "y" || "$rmd" == "Y" ]];then
            #删除文件
            rm -f $1
        fi
    elif [[ "${2}" == "3" ]];then
            if [[ -z `cat $1` ]];then
                print_red_bg "${1}文件为空"
            else
                print_gree_zt "${1}\t已写入数据"
            fi
    else
            $执行对应语句
    fi
else
    $执行对应语句
fi
	
	

 第五个判断【文件存在,二参为3的情况下】:判断文件是否为空,如果为空则提示数据为空,否则提示数据已写入,主要用于匹配结果的判断

    #判断文件是否存在
    if [[ -f "${1}" ]];then
        #判断文件是否需要删除
        if [[ "${2}" == "2" ]];then
            print_red_bg "文件:${1}存在,是否删除[y/n]"
            read rmd	
            #判断用户是否选择删除该文件
            if [[ "$rmd" == "y" || "$rmd" == "Y" ]];then
                #删除文件
                rm -f $1
            fi
        #文件存在,二参为3,开始判断文件是否为空
        elif [[ "${2}" == "3" ]];then
                if [[ -z `cat $1` ]];then
                    print_red_bg "${1}文件为空"
                else
                    print_gree_zt "${1}\t已写入数据"
                fi
        else
                $执行对应语句
        fi
    else
        $执行对应语句
    fi

加入函数调用语句,叠加效果如下:

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
mkdir -p IP
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
print_gree_zt(){
	echo -e "${green_zt}${1}${end}"
}
#帮助信息
if [[ "$1" == "help" || "$1" == "--help" || "$1" == "-h" || "$1" == "?" || -z "$1" ]];then
	print_red_zt_green_zt "程序描述:" "IP对比分析脚本"
	print_red_zt_green_zt "版本信息:" "V1.0(多线程版)"
	print_green_bg "使用帮助:" 
	print_red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
	print_red_zt_green_zt "例如:" " installed.txt"
	print_red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
	print_red_zt_green_zt "例如:" "a.txt b.txt"    
	print_red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
	exit 1
fi
file_chek(){
    #判断文件是否存在
    if [[ -f "${1}" ]];then
        #判断文件是否需要删除
        if [[ "${2}" == "2" ]];then
            print_red_bg "文件:${1}存在,是否删除[y/n]"
            read rmd	
            #判断用户是否选择删除该文件
            if [[ "$rmd" == "y" || "$rmd" == "Y" ]];then
                #删除文件
                rm -f $1
            fi
        #文件存在,二参为3,开始判断文件是否为空
        elif [[ "${2}" == "3" ]];then
                if [[ -z `cat $1` ]];then
                    print_red_bg "${1}文件为空"
                else
                    print_gree_zt "${1}\t已写入数据"
                fi
        else
                $执行对应语句
        fi
    else
        $执行对应语句
    fi
}

file_chek "$ied" "2"
file_chek "$not" "2"

因为函数需要被调用才会执行,所以只有函数是没有输出的,下面加上调用语句:

3.4.2、判断传参数量及文件判断

需求:如果文件存在则绿色,如果不存在则红色并终止程序,调用脚本内容如下:

for i in $*;do
	file_chek "$i" "1"
done

一参传入文件,二参表示需要文件存在,叠加效果如下:

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
#帮助信息
if [[ "$1" -eq 'help' || "$1" -eq '--help' || "$1" -eq "-h" || "$1" -eq "?" || -z "$1" ]];then
    print_red_zt_green_zt "程序描述:" "IP对比分析脚本"
    print_red_zt_green_zt "版本信息:" "V1.0(多线程版)"
    print_green_bg "使用帮助:" 
    print_red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
   print_red_zt_green_zt "例如:" " installed.txt"
    print_red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
    print_red_zt_green_zt "例如:" "a.txt b.txt"    
    print_red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
    exit 1
fi
file_chek(){
	if [[ -f "${1}" ]];then
		if [[ "${2}" == "2" ]];then
			print_red_bg "文件:${1}存在"
		else
			print_green_zt_red_bg "文件存在:" "${1}"
		fi
	else
		if [[ "${2}" == "2" ]];then
			print_green_zt_red_bg "${1}不存在"
		else
			print_red_bg "文件不存在:" "${1}"
		fi
	fi
}	
​for i in $*;do
	file_chek "$i" "1"
done

执行效果如下:

此时帮助信息,字体效果,文件检查都有了,那么就可以正式加入IP检查的循环及功能了

3.5、IP检查函数

IP检查的主体框架就是:

封装一个IP检查的函数(ip_chek)

设置两个传参,一参为主脚本的一参(即已安装的IP文件列表),二参通过for循环传入所有的主脚本传参(包含已安装)

执行一个判断,判断一参和二参的值是否相等,如果相等就跳过,如果不一样就执行循环匹配

3.5.1、IP检查函数框架

ip_chek(){
    if [[ "$1" == "$2" ]];then
        echo "跳过${2}文件"
    else
        echo "开始判断${2}文件"
    fi
}
for i in $*;do
    #一参为主脚本的一参
    #二参为主脚本的所有传参
    ip_chek "$1" "$i"
done

基本的文件判断已经完成了,那么下面就开始实现IP检查的功能模块

3.5.2、IP检查功能模块

##如果一参等于二参则跳过检测
if [[ "$1" == ${2} ]];then
	green_zt "跳过${2}"
else
        echo "开始判断${2}文件"
	#统计被检测文件的行数
	num=`cat $2 | wc -l`
   		for((i=1;i<=${num};i++));do
		ip=`cat $2 | sed -n "${i}p"`
			red_zt_green_zt  "正在检测->>" "${ip}"
			#-Fx:完全匹配,避免类似IP被当成同一IP
			if [[ -z `cat $1 | grep -Fx "${ip}"` ]];then
				echo -e  "${red_bg}${ip}${end}未安装 来自文件: ${red_bg}${2}${end}" 
				echo $ip ${2}>> $not
			else
				echo -e "${green_bg}${ip}${end}已安装 来自文件: ${green_bg}${2}${end}"
				echo $ip  ${2} >> $ied
			fi
	done
fi

3.5.3、脚本植入

#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
print_red_bg(){
	echo -e "${red_bg}${1}${end}"
}
print_green_bg(){
	echo -e "${green_bg}${1}${end}"
}
print_red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
#帮助信息
if [[ "$1" -eq 'help' || "$1" -eq '--help' || "$1" -eq "-h" || "$1" -eq "?" || -z "$1" ]];then
    print_red_zt_green_zt "程序描述:" "IP对比分析脚本"
    print_red_zt_green_zt "版本信息:" "V1.0(多线程版)"
    print_green_bg "使用帮助:" 
    print_red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
   print_red_zt_green_zt "例如:" " installed.txt"
    print_red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
    print_red_zt_green_zt "例如:" "a.txt b.txt"    
    print_red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
    exit 1
fi
file_chek(){
	if [[ -f "${1}" ]];then
		if [[ "${2}" == "2" ]];then
			print_red_bg "文件:${1}存在"
		else
			print_green_zt_red_bg "文件存在:" "${1}"
		fi
	else
		if [[ "${2}" == "2" ]];then
			print_green_zt_red_bg "${1}不存在"
		else
			print_red_bg "文件不存在:" "${1}"
		fi
	fi
}
ip_chek(){
    ##如果一参等于二参则跳过检测
    if [[ "$1" == ${2} ]];then
    	green_zt "跳过${2}"
    else
            echo "开始判断${2}文件"
	    #统计被检测文件的行数
    	num=`cat $2 | wc -l`
   		for((i=1;i<=${num};i++));do
		    ip=`cat $2 | sed -n "${i}p"`
			    red_zt_green_zt  "正在检测->>" "${ip}"
			    #-Fx:完全匹配,避免类似IP被当成同一IP
    			if [[ -z `cat $1 | grep -Fx "${ip}"` ]];then
	    			echo -e  "${red_bg}${ip}${end}未安装 来自文件: ${red_bg}${2}${end}" 
	    			echo $ip ${2}>> $not
	    		else
	    			echo -e "${green_bg}${ip}${end}已安装 来自文件: ${green_bg}${2}${end}"
	    			echo $ip  ${2} >> $ied
	    		fi
	    done
    fi
}
#检查所有传入的文件是否存在
​for i in $*;do
	file_chek "$i" "1"
done
#开始匹配IP
for i in $*;do
    #一参为主脚本的一参
    #二参为主脚本的所有传参
    ip_chek "$1" "$i"
done

3.5.4、脚本效果

这时候的脚本是差不多可以了,然后可以看一下效果

此时出现了一些报错,但是没有关系,一个个解决!首先最简单的就是找不到IP/save_installer.log这个错误,主要原因就是设置了相关数据放入这个相对路径,但是却没有创建它,所以只需要在变量赋值后面追加创建即可,命令如下:

mkdir -p $not $ied

 加上去之后再重新跑一遍

 

ip_chek(){
	##如果一参等于二参则跳过检测
	if [[ "$1" == ${2} ]];then
		green_zt "跳过${2}"
	else
		#统计被检测文件的行数
		num=`cat $2 | wc -l`
		for((i=1;i<=${num};i++));do
			##把任务丢到后台,实现伪多线程
			{
				ip=`cat $2 | sed -n "${i}p"`
				red_zt_green_zt  "正在检测->>" "${ip}"
				#-Fx:完全匹配
				if [[ -z `cat $1 | grep -Fx "${ip}"` ]];then
					echo -e  "${red_bg}${ip}${end}未安装 来自文件: ${red_bg}${2}${end}" 
					echo $ip ${2}>> $not
				else
					echo -e "${green_bg}${ip}${end}已安装 来自文件: ${green_bg}${2}${end}"
					echo $ip  ${2} >> $ied
				fi
			}&
		done
		wait
	fi
}
#!/bin/bash
##IP数据对比分析脚本-多线程版本
##By:不愿意透露姓名的男神

##文件路径变量设置

ied='IP/save_installer.log'
not='IP/save_not_install.log'
mkdir -p IP
##定义字体效果
#红色背景
red_bg='\e[41;33;1m'
#红色字体
red_zt='\e[1;31m'
#绿色背景
green_bg='\033[0;32;1m'
#绿色字体
green_zt='\e[1;32m'
#关闭效果
end='\e[0m'
#打印配置
red_bg(){
	echo -e "${red_bg}${1}${end}"
}
red_zt(){
	echo -e "${red_zt}${1}${end}"
}
green_zt(){
	echo -e "${green_zt}${1}${end}"
}
red_zt_green_zt(){
	echo -e "${red_zt}${1}${end}${green_zt}${2}${end}"
}
#帮助信息
if [[ ! -f "$1" ]];then
	if [[ "$1" -eq 'help' || "$1" -eq '--help' || "$1" -eq "-h" || "$1" -eq "?" || -z "$1" ]];then
		red_zt_green_zt "程序描述:" "IP对比分析脚本"
		red_zt_green_zt "版本信息:" "V1.0(多线程版)"
		red_zt "使用帮助:" 
		red_zt_green_zt "\$1:" "传入已安装服务的IP列表文件"
		red_zt_green_zt "例如:" " installed.txt"
		red_zt_green_zt "\$(2~N):" "传入分部IP列表文件,每个文件使用空格分开"
		red_zt_green_zt "例如:" "a.txt b.txt"    
		red_zt_green_zt "语法模板: " "bash IP_base_数据对比.sh installed.txt IP_list_a.txt IP_list_b.txt"
		exit 1
	fi
else
	#传入文件数量判断
	if [[ "$#" == '1' ]];then
		red_bg "请传入第二个文件"
	fi
fi
#设置文件检查函数
#一参为传入的文件
#二参为判断文件是否应该存在,2表示不该存在,1表示应该要存在
file_chek(){
	if [[ -f "${1}" ]];then
		if [[ "${2}" == "2" ]];then
			red_bg "文件:${1}" "存在"
			if [[ "$3" == "r" ]];then
				red_bg "按回车删除${ied} ${not}"
				read dd
				rm -f $not $ied
			fi
		else
			green_zt "文件存在:${1}"
		fi
	else
		if [[ "${2}" == "1" ]];then
			red_bg "文件${1}不存在"
		else
			green_zt "文件不存在:${1}"
			#exit 11
		fi
	fi
}
##检查IP是否存在于第一个文件中
##一参为"已安装的"文件
##二参为"被检测的"文件
file_chek "$not" "2" "r"
file_chek "$ied" "2" "r"
ip_chek(){
	##如果一参等于二参则跳过检测
	if [[ "$1" == ${2} ]];then
		green_zt "跳过${2}"
	else
		#统计被检测文件的行数
		num=`cat $2 | wc -l`
		for((i=1;i<=${num};i++));do
			##把任务丢到后台,实现多线程
			{
				ip=`cat $2 | sed -n "${i}p"`
				red_zt_green_zt  "正在检测->>" "${ip}"
				#-Fx:完全匹配
				if [[ -z `cat $1 | grep -Fx "${ip}"` ]];then
					echo -e  "${red_bg}${ip}${end}未安装 来自文件: ${red_bg}${2}${end}" 
					echo $ip ${2}>> $not
				else
					echo -e "${green_bg}${ip}${end}已安装 来自文件: ${green_bg}${2}${end}"
					echo $ip  ${2} >> $ied
				fi
			}&
		done
		wait
	fi
}	
##开始检查文件是否存在
for i in $*;do
	file_chek "$i" "1"
done
##开始检测IP
for i in $*;do
	ip_chek "$1" "$i" 
done

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐公交也用券

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值