上一章:
Shell编程_做测试的喵酱的博客-CSDN博客
七、ping
shell脚本,是一个面向过程的编程语言,没有类和对象的概念。用的最多的就是函数。
查看当前服务,是否能ping通baidu
ping www.baidu.com
[root@ecs-39233 dev]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=49 time=10.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=49 time=10.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=3 ttl=49 time=10.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=4 ttl=49 time=10.2 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=5 ttl=49 time=10.2 ms
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 10.214/10.225/10.236/0.111 ms
在当前屏幕,会持续输出ping的内容。
我想实现,ping 只打印一行输出内容。
查看ping 的帮助文档。
ping --help
查看ping的详细介绍文档
man ping
ping -c 可以实现打印行数的控制。 -c1打印一行, -c2打印两行
ping -c1 www.baidu.com
[root@ecs-39233 dev]# ping -c1 www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=49 time=10.2 ms
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 10.232/10.232/10.232/0.000 ms
八、2>&1
linux中的2>&1是什么_2&>1_康大壮的博客-CSDN博客
Linux 中 2>&1 详解_2>&1_迎风悟极道的博客-CSDN博客
8.1 1和2在Linux中的含义
在Linux系统中0 1 2是一个文件描述符:
标准的输入,输出和错误输出分别表示为STDIN,STDOUT,STDERR,也可以用0,1,2来表示。
名称 | 代码 | Linux 下文件描述符(Debian 为例) |
标准输入(stdin) | 0 | /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0 |
标准输出(stdout) | 1 | /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0 |
标准错误输出(stderr) | 2 | /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 |
其中0表示键盘输入 1表示屏幕输出 2表示错误输出。
8.2 2>&1的含义
2>&1的含义:将标准错误输出重定向到标准输出。
注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。
8.3 举例
8.3.1 command >/dev/null 2>&1 &
command 我们写的指令
> 重定向
/dev/null 表示空设备文件,相当于垃圾桶
2 标准错误输出
1 标准输出
2>&1的含义:将标准错误输出重定向到标准输出。注意:2>&1,中间不能有空格。
注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。
command>/dev/null ,它默认等于command 1>/dev/null ,即将标准输出结果重定向到/dev/null
2>&1, 将标准错误输出重定向到标准输出 。标准输出1,已经被重定向到了/dev/null,错误输出重定向到标准输出,则错误输出也被重定向到了/dev/null
最后一个&, 是让该命令在后台执行。
8.3.2 command >out.file 2>&1 &
command >out.file 是将command的输出重定向到out.file文件,输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1 是将标准出错重定向到标准输出,因为标准输出已经重定向到了out.file文件,所以标准出错也输出到out.file文件中。
最后一个&, 是让该命令在后台执行。
九、函数
9.1 定义函数的格式
定义函数,有2种方式。
定义函数,方式一
函数名()
{
命令1
命令2
....
}
命令1,前的空格一般空四个 。
定义函数,方式二
使用function 关键字
function 函数名
{
命令1
命令2
...
}
命令1,前的空格一般空四个 。使用function 定义函数时,函数名后没有括号。
举例:
创建 study_shell.sh
#!/bin/bash
# author: miao
# date: 2023
# 方法一,打印当前登录用户名称和时间
print_user()
{
echo -e "Hello ${USER},date: $(date)"
}
# 方法二,打印当前路径
function print_pwd
{
echo "$(pwd)"
}
# 调用方法一
print_user
# 调用方法二
print_pwd
注意:
调用变量的格式,${USER}
调用方法的格式, $(date)
执行 study_shell.sh
[root@ecs-39233 chenshuai]# sh study_shell.sh
Hello root,date: Tue Apr 18 07:31:08 CST 2023
/chenshuai
9.2 ping host 小案例
实现一个ping 功能的函数 。以www.baidu.com 为例
如何判断ping 通。我们可以通过echo $? 查看状态。
ping 一个不存在的地址
[root@ecs-39233 ~]# ping -c1 www.baidusssss.com; echo $?
ping: www.baidusssss.com: Name or service not known
2
返回非0
ping 百度,返回0
[root@ecs-39233 ~]# ping -c1 www.xxxx.com; echo $?
PING www.xxxx.com (54.153.216.130) 56(84) bytes of data.
64 bytes from ec2-54-153-216-130.ap-southeast-2.compute.amazonaws.com (54.153.216.130): icmp_seq=1 ttl=35 time=165 ms
--- www.xxxx.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 165.493/165.493/165.493/0.000 ms
0
ping -c1 www.baidu.com > /dev/null 2>&1
ping -c1 打印一行输出
> /dev/null 将标准输出,重定向到虚拟文件
2>&1 2标准错误输出,等同于>& 标准输出1。(都会重定向到/dev/null)中
编写脚本check_host.sh
vim check_host.sh
#!/bin/bash
# author: miao
#description: check host,检查主机是否在线
function check_host
{
ping -c1 www.baidu.com &> /dev/null
test $? -eq 0 && echo -e "服务【www.baidu.com】正常启动" || echo -e "服务【www.baidu.com】离线状态"
}
# 调用函数
check_host
注意,脚本中 &> /dev/null 中的 &> 表示将所有的输出(标准输出和标准错误输出)全部重定向
运行脚本sh check_host.sh
[root@ecs-39233 ~]# sh check_host.sh
服务【www.baidu.com】正常启动
9.3 参数
9.2 中,ping host 案例,host是写死的。现在用传参变量代替里面的host。
函数获取参数的形式,与命令行获取参数的形式是一样的。都是通过$1 获取。
在函数的内部,使用$1 就可以获取第一个参数。$2 就可以获取第二个参数。
对 check_host.sh 进行改造。
复制一份
cp check_host.sh new_check_host.sh
修改 new_check_host.sh
vim new_check_host.sh
用变量替换里面的host
#!/bin/bash
# author: miao
#description: check host,检查主机是否在线
function check_host
{
server_name="$1"
host="$2"
ping -c1 "${host}" &> /dev/null
test $? -eq 0 && echo -e "服务【${server_name}】正常启动" || echo -e "服务【${server_name}】离线状态"
}
# 调用函数
check_host $1 $2
直接运行 new_check_host.sh 脚本
[root@ecs-39233 ~]# sh new_check_host.sh
服务【】离线状态
使用参数,百度 www.baidu.com
[root@ecs-39233 ~]# sh new_check_host.sh 百度 www.baidu.com
服务【百度】正常启动
讲解脚本中的参数传递。
函数check_host 中,使用了两个变量 $1 $2(函数内部 参数)
$1 表示调用函数check_host 函数时第一个参数。
在调用check_host 的代码中。参数$1 $2 ,获取的是调用new_check_host.sh 脚本时,用户在命令行中输入的参数。