day030-Shell自动化编程-函数

文章目录

  • [1. 循环控制语句](#1. 循环控制语句)
    • [1.1 案例-通过交互方式获取用户需要检查的ip/域名,用户输入q则退出](#1.1 案例-通过交互方式获取用户需要检查的ip/域名,用户输入q则退出)
  • [2. 函数](#2. 函数)
    • [2.1 用函数改造上面脚本](#2.1 用函数改造上面脚本)
    • [2.2 案例-通过ip.txt文件,检查常用端口是否开启](#2.2 案例-通过ip.txt文件,检查常用端口是否开启)
    • [2.3 函数与参数](#2.3 函数与参数)
  • [3. 颜色](#3. 颜色)
    • [3.1 案例-用户自定义函数库,自定义颜色](#3.1 案例-用户自定义函数库,自定义颜色)
  • [4. 思维导图](#4. 思维导图)

1. 循环控制语句

1.1 案例-通过交互方式获取用户需要检查的ip/域名,用户输入q则退出

shell 复制代码
[root@oldboy99-Kylin /server/scripts/function_scripts]# cat check_ip.sh
#!/bin/bash
##############################################################
# File Name: check_ip.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:检查ip/域名
##############################################################
export LANG=en_US.UTF-8

# vars
tmp_file=`mktemp`
# command
# while 读取ip
while true
do
	read -p '请输入ip或url,结束请输入q:' ip
	[ -z "$ip" ] && {
		echo "输出错误请重新输入"
		continue
	} 
	[ "$ip" = "q" ] && {
		echo "输入结束,进行后续检查操作"
		break
	}
	echo $ip >> $tmp_file
done 
# 检查ip
while read line
do
	# ping 
	ping -c 1 -W 1 $line >/dev/null 2>&1
	[ $? -eq 0 ] && echo "$line 可以ping通" || echo "$line 不能ping通"
	# wget
	wget -S -T 1 -t 1 $line >/dev/null 2>&1
	[ $? -eq 0 ] && echo "$line 可以访问" || echo "$line 不能访问"
done <$tmp_file
[root@oldboy99-Kylin /server/scripts/function_scripts]# bash check_ip.sh
请输入ip或url,结束请输入q:baidu.com
请输入ip或url,结束请输入q:jd.com
请输入ip或url,结束请输入q:127.0.0.1
请输入ip或url,结束请输入q:q
输入结束,进行后续检查操作
baidu.com 可以ping通
baidu.com 可以访问
jd.com 可以ping通
jd.com 不能访问
127.0.0.1 可以ping通
127.0.0.1 不能访问

2. 函数

2.1 用函数改造上面脚本

shell 复制代码
[root@oldboy99-Kylin /server/scripts/function_scripts]# cat check_ip2.sh
#!/bin/bash
##############################################################
# File Name: check_ip.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:检查ip/域名
##############################################################
export LANG=en_US.UTF-8

# vars
tmp_file=`mktemp`
# command
# while 读取ip
function input(){
	while true
	do
		read -p '请输入ip或url,结束请输入q:' ip
		[ -z "$ip" ] && {
			echo "输出错误请重新输入"
			continue
		} 
		[ "$ip" = "q" ] && {
			echo "输入结束,进行后续检查操作"
			break
		}
		echo $ip >> $tmp_file
	done 
	return $?
}
# 检查ip
function check_ip(){
	ping -c 1 -W 1 $line >/dev/null 2>&1
	[ $? -eq 0 ] && echo "$line 可以ping通" || echo "$line 不能ping通"
	return $?
}
# 检查wget
function check_wget(){
	wget -S -T 1 -t 1 $line >/dev/null 2>&1
	[ $? -eq 0 ] && echo "$line 可以访问" || echo "$line 不能访问"
	return $?
}
# 读取文件
function read_file(){
	while read line 
	do
		check_ip
		check_wget
	done < $tmp_file
	return $?
}
# main函数
function main(){
	input
	read_file
	return $?
}
main
[root@oldboy99-Kylin /server/scripts/function_scripts]# bash check_ip2.sh
请输入ip或url,结束请输入q:  
输出错误请重新输入
请输入ip或url,结束请输入q:baidu.com
请输入ip或url,结束请输入q:jd.com
请输入ip或url,结束请输入q:q
输入结束,进行后续检查操作
baidu.com 可以ping通
baidu.com 可以访问
jd.com 可以ping通
jd.com 可以访问

2.2 案例-通过ip.txt文件,检查常用端口是否开启

shell 复制代码
[root@oldboy99-Kylin /server/scripts/function_scripts]# cat check_ip_port.sh
#!/bin/bash
##############################################################
# File Name: check_ip_port.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:检查ip的一些端口是否开启
##############################################################
export LANG=en_US.UTF-8

# vars
file="/server/scripts/log/ip.txt"
ports="22,80,443,3306,8080"
source /etc/os-release
# 检查nmap是否存在,不存在则按安装
function check_cmd(){
	which nmap >/dev/null 2>&1 ||{
		case "$ID" in 
			kylin|centos|rocky)
				yum clean all
				yum install -y nmap
				;;
			ubuntu|debian)
				apt install -y nmap
				;;
			*)
				echo "$ID未识别的系统请手动按照软件包:nmap,然后重新测试"
				exit 1
		esac
	}
	return $?
}
# 检查nmap
function check_nmap(){
	nmap -p $ports $line |grep '^[0-9]' |while read port state name
	do
		if [ "$state" = "open" ];then
			echo "服务器:$line ,端口:$port ,端口是否开启:是"
		else
			echo "服务器:$line ,端口:$port ,端口是否开启:否/屏蔽"
		fi
	done
	return $?
}
# 读取文件
function read_file(){
	# 检查ping
	while read line 
	do
		ping -c 1 -W 1 $line > /dev/null 2>&1 || {
			echo "$line 无法访问"
			continue
		}
		check_nmap
	done<$file
	return $?
}
# main
function main(){
	check_cmd
	read_file
	return $?
}

# command
main
[root@oldboy99-Kylin /server/scripts/function_scripts]# bash check_ip_port.sh
服务器:10.0.0.200 ,端口:22/tcp ,端口是否开启:否/屏蔽
服务器:10.0.0.200 ,端口:80/tcp ,端口是否开启:是
服务器:10.0.0.200 ,端口:443/tcp ,端口是否开启:否/屏蔽
服务器:10.0.0.200 ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:10.0.0.200 ,端口:8080/tcp ,端口是否开启:否/屏蔽
服务器:baidu.com ,端口:22/tcp ,端口是否开启:否/屏蔽
服务器:baidu.com ,端口:80/tcp ,端口是否开启:是
服务器:baidu.com ,端口:443/tcp ,端口是否开启:是
服务器:baidu.com ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:baidu.com ,端口:8080/tcp ,端口是否开启:否/屏蔽
服务器:jd.com ,端口:22/tcp ,端口是否开启:否/屏蔽
服务器:jd.com ,端口:80/tcp ,端口是否开启:是
服务器:jd.com ,端口:443/tcp ,端口是否开启:是
服务器:jd.com ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:jd.com ,端口:8080/tcp ,端口是否开启:否/屏蔽
服务器:csdn.net ,端口:22/tcp ,端口是否开启:否/屏蔽
服务器:csdn.net ,端口:80/tcp ,端口是否开启:是
服务器:csdn.net ,端口:443/tcp ,端口是否开启:是
服务器:csdn.net ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:csdn.net ,端口:8080/tcp ,端口是否开启:否/屏蔽
服务器:520skx.com ,端口:22/tcp ,端口是否开启:是
服务器:520skx.com ,端口:80/tcp ,端口是否开启:是
服务器:520skx.com ,端口:443/tcp ,端口是否开启:否/屏蔽
服务器:520skx.com ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:520skx.com ,端口:8080/tcp ,端口是否开启:否/屏蔽
服务器:www.520skx.com ,端口:22/tcp ,端口是否开启:是
服务器:www.520skx.com ,端口:80/tcp ,端口是否开启:是
服务器:www.520skx.com ,端口:443/tcp ,端口是否开启:否/屏蔽
服务器:www.520skx.com ,端口:3306/tcp ,端口是否开启:否/屏蔽
服务器:www.520skx.com ,端口:8080/tcp ,端口是否开启:否/屏蔽
Failed to resolve "孙克旭.com".
WARNING: No targets were specified, so 0 hosts scanned.
123waeffawe.com 无法访问

2.3 函数与参数

特殊变量 脚本中的含义 函数中的含义
$n 脚本的第n个参数 函数的第n个参数
$0 脚本名字 脚本名字
$# 脚本参数个数 函数参数个数
$* 脚本所有参数 函数所有参数
$@ 脚本所有参数 函数所有参数
$? 上一个命令的返回值 上一个命令的返回值

3. 颜色

  • \E 或\033 表示要开启这种功能。

  • 1;31m

  • \E[0m 颜色设置结束。

3.1 案例-用户自定义函数库,自定义颜色

shell 复制代码
[root@oldboy99-Kylin /server/scripts/function_scripts]# cat color_func.sh 
#!/bin/bash
##############################################################
# File Name: color_func.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################

#1.红色函数
function redecho() {
 str="$@"
 echo -e "\E[5;31m${str}\E[0m"
 }

 #2.红色函数
function greenecho() {
 str="$@"
 echo -e "\E[1;32m${str}\E[0m"
 }
 #3.红色函数
function yellowecho() {
 str="$@"
 echo -e "\E[1;33m${str}\E[0m"
 }
 #4.红色函数
function blueecho() {
 str="$@"
 echo -e "\E[1;34m${str}\E[0m"
 }

4. 思维导图

【金山文档】 思维导图 https://www.kdocs.cn/l/co3I7PtpTYQX

相关推荐
myloveasuka5 分钟前
[Linux]内核态与用户态详解
linux
@BreCaspian9 分钟前
在HP暗影精灵Ubuntu20.04上修复IntelAX211Wi-Fi不可用的全过程记录——系统安装以后没有WIFI图标&无法使用无线网
linux
小眼睛FPGA14 分钟前
【RK3568+PG2L50H开发板实验例程】Linux部分/FPGA dma_memcpy_demo 读写案例
linux·运维·科技·ai·fpga开发·gpu算力
weixin_4373982122 分钟前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang
津津有味道31 分钟前
Qt C++串口SerialPort通讯发送指令读写NFC M1卡
linux·c++·qt·串口通信·serial·m1·nfc
JeffersonZU1 小时前
Linux/Unix文件IO(文件描述符、原子操作、文件数据结构、open、read、write、fcntl、dup)
linux·c语言·unix·gnu
szekl2 小时前
HDMI 2.0 4×2矩阵切换器412HN——多信号输入输出的高清解决方案
linux·矩阵·计算机外设·电脑·ekl
weixin_399380692 小时前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes
阿巴~阿巴~2 小时前
Linux基本命令篇 —— uname命令
linux·运维·服务器
天空之城夢主2 小时前
KVM高级功能部署
linux·服务器