今日小练题目📢
写一个监控脚本,监控某站点访问是否正常。 提示: 1)可以将访问的站点以参数的形式提供,例如 sh xxx.sh www.aminglinux.com 2) 状态码为2xx或者3xx表示正常 3)正常时echo正常,不正常时echo不正常
优秀作业🤌🏻
#!/bin/bash
# author:xYLiuuuuuu
# version:v1
# date:2024-12-1
if ! which curl &>/dev/null
then
echo "本机没有安装curl"
apt install curl
if [ $? -ne 0 ]
then
echo "没有安装成功curl"
exit 1
fi
fi
code=`curl --connect-timeout 3 -I $1 2>/dev/null | grep 'HTTP' |awk '{print $2}'`
if echo $code |grep -qE '^2[0-9][0-9]|^3[0-9][0-9]'
then
echo "$1访问正常"
else
echo "$1访问不正常"
fi
敲黑板📝
- grep命令
# 多文件搜索
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep "本机" day10.sh day1.sh
day10.sh: echo "本机没有安装curl"
# 加-l参数,列出包含key的文件名
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep -l "本机" day10.sh day1.sh
day10.sh
# 加-n参数,列出行号
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep -n "本机" day10.sh day1.sh
day10.sh:8: echo "本机没有安装curl"
# 加-v参数,显示与模式不匹配的行
$ grep -v "本机" day10.sh
# ^开头,$结尾
$ grep ^abc file
$ grep abc$ file
# 递归搜索加-r
$ grep -r key /dir
# 使用特殊字符组合 “^$” 打印文件中的所有空行
$ grep -n '^$' /etc/sysctl.conf
# “-i” 选项忽略模式和数据中的字母大小写
# 借助 grep 命令中的 “-e” 选项,我们可以在单个命令中搜索多个模式。
$ grep -E "nobody|mail" /etc/passwd
# “-c” 选项用于计算与搜索模式匹配的行数。
$ grep -c false$ /etc/passwd
6
# 打印模式匹配前后的 N 行
$ grep -B 4 "games" /etc/passwd #前
$ grep -A 4 "games" /etc/passwd #后
$ grep -C 4 "games" /etc/passwd #前后各四行
/dev/null通常被用于丢弃不需要的输出流,或作为用于输入流的空文件
# 将标准输出重定向到 /dev/null
command > /dev/null
# 将错误信息重定向到 /dev/null
command 2> /dev/null
# 将标准输出和错误信息都重定向到 /dev/null
command > /dev/null 2>&1
常见使用场景:
# 通过把删除命令的输出重定向到 `/dev/null` 来避免输出错误信息, 同时也不用判断文件是否存在了
rm $1 >/dev/null 2>$1
# 清空文件内容
[tt@ecs-centos-7 dev_test]$ cat t.txt
123456
[tt@ecs-centos-7 dev_test]$ cat /dev/null > t.txt
[tt@ecs-centos-7 dev_test]$ cat t.txt
# 只显示错误信息
command > /dev/null
# 只显示输出
command 2> /dev/null
$?表示前一条命令的执行结果, 0 表示成功,其他表示失败- shell传递参数
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
$ chmod +x test.sh
$ ./test.sh 1 2 3
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
特殊的:
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$* 与 $@ 区别:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3