RHCE的学习(21)

第三章 Shell条件测试

用途

  • 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。

  • 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。

  • 条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的

基本语法

格式:

格式1: test  -参数  条件表达式test   数值比较   -eq       test a -eq b       test   字符比较    a = b   test a == b [ ] 算数比较 -eq  =  ==但> <运算符有问题需要通过\转义符  -a -o !    [ ] 字符比较test支持= ==; 不支持-eq  测试符和测试值之间通过空格分割[[ ]] && ||   算数比较不需要转义符    [[ ]] 可以支持正则   =~格式2: [  条件表达式  ]     # 注意:[]的左右要有空格   
格式3: [[  条件表达式  ]]   # 注意:[]的左右要有空格
格式4: ((条件表达式))

重点数值比较符通过字符类的测试测试

test[ ][[ ]] ---支持正则符
数值比较test 1-eq 2 (-eq -gt -lt -ge -le -ne)-eq -gt -lt -ge -le -ne -a -o !-eq -gt -lt -ge -le -ne && || ! --测试符都支持
字符比较test a = b 或者 test a == b -a -o != == -a -o != == && || ! a =~ ".*" a == a
  • test单独使用,判断条件为真,echo $?返回0,假返回1

  • test与[ ]等价

  • [[ ]] 是扩展命令,可以使用通配符等进行模式匹配,&& || > < 等操作符可以直接应用于双中括号中,但不能用于单中括号中

  • (()) 一般用于if语句里,两端不需要有空格,测试对象为整数

# test语法
[root@server ~]# test -f  /etc/passwd
[root@server ~]# echo  $?
0
[root@server ~]# test -f  /etc/aa
[root@server ~]# echo  $?
1
[root@server ~]# 
[root@server ~]# test  -f  /etc/passwd  &&  echo  1 || echo  0
1
[root@server ~]# test  -f  /etc/aa  &&  echo  1 || echo  0
0
[root@server ~]# test  -f  /etc/passwd  &&  echo  yes || echo  no
yes
[root@server ~]# test  -f  /etc/aa  &&  echo  yes || echo  no
no
[root@server ~]# if  test -f /etc/passwd ; then  echo  1 ; else echo no ;fi
1
[root@server ~]# if  test -f /etc/aa ; then  echo  1 ; else echo no ;fi
no
# [] 语法
[root@server ~]# [-f  /etc/passwd]    # 注意:[] 中要有空格
bash: [-f: command not found...
​
[root@server ~]# [  -f  /etc/passwd ]
[root@server ~]# echo  $?
0
[root@server ~]# [  -f  /etc/aa ]
[root@server ~]# echo  $?
1
[root@server ~]# [  -f  /etc/aa ] &&  echo  y  ||  echo  n
n
[root@server ~]# [  -f  /etc/passwd ] &&  echo  y  ||  echo  n
y
[root@server ~]# if  [ -f /etc/passwd ] ; then  echo  1 ; else echo no ;fi
1
[root@server ~]# if  [ -f /etc/aa ] ; then  echo  1 ; else echo no ;fi
no
# [[]]  语法
[root@server ~]# [[ 3 > 2 || 1 > 2 ]]  &&  echo  1 || echo 0
1
[root@server ~]# [[ 3 > 2 && 1 > 2 ]]  &&  echo  1 || echo 0
0
(()) 语法
[root@server ~]# ((9>5))  &&  echo 1  || echo 0
1
[root@server ~]# (( 9 > 5 ))  &&  echo 1  || echo 0
1
[root@server ~]# ((9>5))  &&  echo 1  || echo 0
1
[root@server ~]# ((9>13))  &&  echo 1  || echo 0
0
​
[root@server ~]# ((9>13.5))  &&  echo 1  || echo 0  # 注意:不支持小数运算
-bash: ((: 9>13.5:语法错误: 无效的算术运算符 (错误符号是 ".5")
0

文件测试

参数:

参数作用
-b 文件名检测文件是否是块设备文件,是返回 true
-c 文件名是否是字符设备文件
-d 文件名是否是目录
-f 文件名是否是普通文件(既不是目录,也不是设备文件)
-S 文件名是否为socket文件
-P 文件名是否为管道符文件
-L 文件名是否为链接文件
-u 文件名是否有suid的权限
-s 文件名是否为空(文件大小是否大于0),不为空返回 true
-e 文件名检测文件(包括目录)是否存在,如果是,则返回 true
-r 文件名检测文件是否可读,如果是,则返回 true。
-w 文件名检测文件是否可写,如果是,则返回 true
-x 文件名检测文件是否可执行,如果是,则返回 true
f1 -nt f2文件f1比文件f2新则为真(根据文件修改时间计算)
f1 -ot f2文件f1比文件f2旧则为真(根据文件修改时间计算)

//普通文件测试
[root@localhost ~]# touch file1.txt
[root@localhost ~]# [ -f file1.txt ] && echo yes || echo no
yes
//目录测试
[root@localhost ~]# [ -d /tmp ] && echo yes || echo no
yes
//测试文件属性
[root@localhost ~]# ll file1.txt 
-rw-r--r-- 1 root root 0 8月  28 12:30 file1.txt
[root@localhost ~]# [ -r file1.txt ] && echo yes || echo no
yes
[root@localhost ~]# [ -x file1.txt ] && echo yes || echo no
no
[ -e ]
[ -s ]
[root@server ~]# [ -d /root ] && echo  y || echo n
y
[root@server ~]# [ -d /aa ] && echo  y || echo n
n
[root@server ~]# [ -b /dev/nvme0n1 ] && echo  y || echo n
y
[root@server ~]# [ -L /dev/cdrom ] && echo  y || echo n
y
[root@server ~]# ll  /dev/cdrom 
lrwxrwxrwx 1 root root 3  3月 22 11:31 /dev/cdrom -> sr0
[root@server ~]# [ -e /file1 ] && echo  y || echo n
n
[root@server ~]# touch  /file1
[root@server ~]# [ -e /file1 ] && echo  y || echo n
y
# 编写脚本,测试文件是否存在,不存在则创建
[root@server ~]# vim  temp1.sh
#!/bin/bash
​
FILE=$1
echo  FILE
​
if test -e $FILE
thenecho  "$FILE文件已存在"
else    echo  "$FILE文件不存在,开始新建..."touch  $FILEls  -l $FILE
fi 
​
[root@server ~]# bash temp1.sh  /etc/passwd
/etc/passwd
/etc/passwd文件已存在
[root@server ~]# bash temp1.sh  temp
temp
temp文件不存在,开始新建...
-rw-r--r-- 1 root root 0  6月 17 14:53 temp
# 上例改写
[root@server ~]# vim  temp1.sh
#!/bin/bash
​
read -p "请输入文件名: "  FILE
​
if test -e $FILE
thenecho  "$FILE文件已存在"
elseecho  "$FILE文件不存在,开始新建..."touch  $FILEls  -l $FILE
fi
​
[root@server ~]# bash temp1.sh
请输入文件名: /etc/sos/sos.conf
/etc/sos/sos.conf文件已存在
[root@server ~]# bash temp1.sh
请输入文件名: t1
t1文件不存在,开始新建...
-rw-r--r-- 1 root root 0  6月 17 14:56 t1

字符串运算符

示例:

//-n如果字符串长度不为零输出yes,否则输出no
[root@localhost ~]# [ -n "hello" ] && echo yes || echo no
yes
[root@localhost ~]# [ -n "" ] && echo yes || echo no
no
注意://变量为空时通过[[]]进行测试,[]测试有问题
[root@localhost ~]# str=`grep xixi /etc/passwd`  
[root@localhost ~]# [[ -n $str ]] && echo 有 || echo 无
无
[root@localhost ~]# [ -n $str ] && echo 有 || echo 无
有//-z如果字符串长度为零输出yes,否则输出no
[root@localhost ~]# [ -z "hello" ] && echo yes || echo no
no
[root@localhost ~]# [ -z "" ] && echo yes || echo n
yes
// 字符串相等比较
注意:=的左右有空格,没有空格将会导致逻辑错误。
[root@localhost ~]# [ "HELLO" = "hello" ] && echo yes || echo no
no
[root@localhost ~]# [ "HELO" != "hello" ] && echo yes || echo no
yesif [ -z $a ]
thenecho "-z $a : 字符串长度为 0"
elseecho "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
thenecho "-n $a : 字符串长度不为 0"
elseecho "-n $a : 字符串长度为 0"
fi
if [ $a ]     -------$判断z字符串是否为空,不空为真,空为假
thenecho "$a : 字符串不为空"
elseecho "$a : 字符串为空"
fi

整数测试(关系运算符 )

作用

  • 用于比较两个数值的大小关系,操作的对象是数值

操作符

数值测试:
[root@172 ~]# [ 1 -eq 2 ] &&  echo yes || echo no
no
[root@172 ~]# test 1 -eq 2 && echo yes || echo no
no
[root@172 ~]# [[ 1 = 2 ]] && echo yes || echo no
no
[root@172 ~]# [[ 1 -eq  2 ]] && echo yes || echo no
no
[root@172 ~]# ((1>=2)) && echo yes || echo no
no字符串比较
[root@172 ~]# [[ "a" == "b" ]]
[root@172 ~]# echo $?
1

示例:

[root@localhost ~]# [ 5 -gt 3 ] && echo yes || echo no
yes
[root@localhost ~]# [ `id -u` -eq 0 ] && echo admin || echo other
admin
[root@localhost ~]# su - student
[student@localhost ~]$ [ `id -u` -eq 0 ] && echo admin || echo other
other

[root@server ~]# [ 5 -gt 3 ] && echo y || echo n  
y
[root@server ~]# test  5 -gt 3  && echo y || echo n  
y
[root@server ~]# ((5>3))  && echo y || echo  0
y
# 知识拓展
# 检查左侧内容是否包含右侧的表达式,可以使用 =~ 正则匹配,表示是否包含
[root@server ~]# n=123
[root@server ~]# [[ "$n"  =~ ^[0-9]+$  ]]  && echo  y  || echo  n
y
[root@server ~]# n=123ttt
[root@server ~]# [[ "$n"  =~ ^[0-9]+$  ]]  && echo  y  || echo  n
n

注意:

字符类的用数学内的比较符,数值类的用字符类比较符

如果数值内的用数学类比较符,例:[ 12 \< 2 ] 结果是true,因为比较方法是先比较第一个数字,再依次向后比较:1 < 2  所以12 < 2

逻辑操作符/布尔运算符

符号

例:

[root@server ~]# [ -f /etc/passwd  -a -f /etc/services ] && echo  1 || echo 0
1
[root@server ~]# [ -f /etc/hosts  -o  -d /etc/services ] && echo  1 || echo 0
1
[root@server ~]# ((5<10 && 5>2))  && echo y || echo n
y
[root@server ~]# ((2<5<10))  && echo y || echo n
y
[root@server ~]# ((2<5<1))  && echo y || echo n
n
[root@server ~]# ((6<5<10))  && echo y || echo n
y
[root@server ~]# ((2<5<-1))  && echo y || echo n
n
  • 命令分隔符

cmd1;cmd2     以独立的进程依次执行cmd1和cmd2
(cmd1;cmd2)   在同一进程中依次执行cmd1和cmd2
cmd1&cmd2     cmd1和cmd2同时执行,分属于不同的进程
cmd1&&cmd2    当cmd1为真时,则执行cmd2
cmd1||cmd2    当cmd1不为真时,则执行cmd2
cmd&          后台执行
# 若账户fox10不存在,则添加账户
[root@server ~]# id fox10  &>  /dev/null  &&  echo  "fox10已存在"  ||  useradd  fox10# &>  /dev/null 表示将左侧命令执行的正确和错误输出到“黑洞”即不显示到屏幕

命令执行顺序

复合指令:即一串命令

()和{}都是对一串的命令进行执行,但有所区别:

相同点:

  • ()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用 号隔开
  • ()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

不同点 :

  • ()只是对一串命令重新开一个子shell进行执行, {}对一串命令在当前shell执行
  • ()最后一个命令可以不用分号,{}最后一个命令要用分号
  • ()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格

示例:

[root@localhost scripts]# (pwd;cd /tmp;pwd)
/scripts
/tmp
# ()子shell中执行,执行完毕,当前路径不变
[root@localhost tmp]# { pwd;cd /tmp;pwd; } > aaa
/tmp
/tmp
[root@localhost tmp]# pwd;cd /;pwd
比较:
(cd;pwd;hostname)  == { cd;pwd;hostname;} 

示例:

// 如果目录/abc存在给出提示信息目录已存在,否则创建目录
​[ -e /abc -a -d /abc ]
方法1:[root@localhost ~]# [ -d /abc ] && echo exists || mkdir /abc
方法2:[root@localhost ~]# [ ! -d /abc ] && mkdir /abc || echo exists

案例分析

  • 例1:判断当前已登录账户数,若超过5个则输出“Too many”

分析:1)如何查看当前登录用户--> who
           2)已登录的用户数--> who | wc -l
     num=$(who  | wc -l)
    [ $num -gt 5 ] && echo "Too many"

[root@server ~]# num=$(who | cut -d " " -f1 | sort -u | wc -l)[root@server ~]# [ $num -gt 5 ] && echo "Too many" || echo "已登录账户数:$num"
已登录账户数:1# who : 查看当前已登录的账户信息# cut -d " " -f1 :以空格为列向分割符,截取第1部分# sort -u :去重后排序# wc  -l:计算行数# 上例改写为:
[root@server ~]# (($num>5))  && echo "Too many" || echo "已登录账户数:$num"
  • 例2:编写脚本temp2.sh ,程序从键盘读入一个目录名,判断该命令是否存在,若不存在则创建,并显示目录信息

[root@server ~]# vim  temp2.sh
#!/bin/bashcd  /
ls
read -p "请输入一个目录名:"  dir
test  -d  $dir  &&  ls  -l  $dir  || (echo "目录不存在,开始新建..." ; mkdir  $dir ; ls -l $dir)
  • 例3:如果/var/log/messages文件行数大于30行,则显示提示信息

[root@server ~]# (($(cat  /var/log/messages | wc -l)>30)) && echo  "好大一个文件" || echo  "还能接受"
  • 例4:编写脚本temp3.sh,功能:显示root目录下的文件信息,之后建立一个aa目录,在aa目录下新建一个文件bb.txt,并修改该文件的权限为可执行,最后再次浏览信息

[root@server ~]# vim  temp3.sh
#!/bin/bashls -l /rootmkdir  /root/aatouch  /root/aa/bb.txtchmod  +x  /root/aa/bb.txtls -l /root
  • 例5:编写脚本temp4.sh,从键盘读入x,y,计算和值后输出

[root@server ~]# vim  temp4.sh
#!/bin/bashread -p "请输入x的值:" xread -p "请输入y的值:" yif  [ -n "$x" -a  -n  "$y" ]  # -n判断非空
thenif  [[ "$x" =~ ^[0-9]+$ ]]  &&  [[ "$y" =~ ^[0-9]+$ ]] # 判断是数字thenecho  $[x+y]elseecho  "请输入数字"fi
elseecho "请输入有效内容"
fi
  • 例6:编写temp5.sh脚本显示所有用户,选择一个用户输入,判断是root账户还是系统账户还是普通账户

[root@server ~]# vim  temp5.sh
#!/bin/bashcat /etc/passwd | cut -d ":" -f1 | sort -uread -p "请输入一个账户名:"  usus_num=$(id -u $us)if  (($us_num==0))
thenecho  "此用户为管理员账户"
elseif (($us_num>=1 && $us_num<=999))thenecho  "此账户为系统账户"elseecho  "普通账户"fi
fi
  • 例7:编写脚本temp6.sh ,给定文件/etc/sos/sos.conf,判断是否存在空白行,若存在则显示行数,否则显示“无空白行”提示信息

[root@server ~]# vim  temp6.sh
#!/bin/bashnum=$(grep  ^$  /etc/sos/sos.conf | wc -l)if  (($num>0))
thenecho  "/etc/sos/sos.conf文件含有空白行,行数:$num,位置如下:"grep  -n  ^$  /etc/sos/sos.conf
elseecho  "/etc/sos/sos.conf此文件无空白行"
fi

总结:

  1. 文件测试
  2. 算数运算符
  3. 字符串运算符 -n
  4. 关系型运算符
  5. 逻辑运算符

test    [ ]     [ [ ] ]    ( ( ) )

1.文件测试符  -f  -d  -e  -L  -b  -c  -p  -S  -s  -r  -w  -x / -u -g -k

2.字符串判断符 -n -z

3.关系运算符 -gt -lt -eq -ge -le    <  =

4.逻辑运算符 布尔值  &&  ||  !  -a -o !

5.整体引用符 (cd;pwd;hostname) == { cd;pwd;hostname;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)

从生成 SSH 密钥到成功连接测试的经验笔记&#xff08;以Gitee为例&#xff09; 1. 生成 SSH 密钥对 选择合适的加密算法 ED25519&#xff1a; 密钥长度&#xff1a;私钥 256 位&#xff08;32 字节&#xff09;&#xff0c;公钥 256 位&#xff08;32 字节&#xff09;&#…

uni-app Vue3语法实现微信小程序样式穿透uview-plus框架

1 问题描述 我在用 uni-app vue3 语法开发微信小程序时&#xff0c;在项目中使用了 uview-plus 这一开源 UI 框架。在使用 up-text 组件时&#xff0c;想要给它添加一些样式&#xff0c;之前了解到微信小程序存在样式隔离的问题&#xff0c;也在uview-plus官网-注意事项中找到…

数据结构(双向链表——c语言实现)

双向链表相比于单向链表的优势&#xff1a; 1. 双向遍历的灵活性 双向链表&#xff1a;由于每个节点都包含指向前一个节点和下一个节点的指针&#xff0c;因此可以从头节点遍历到尾节点&#xff0c;也可以从尾节点遍历到头节点。这种双向遍历的灵活性使得在某些算法和操作中&a…

C# AutoMapper 10个常用方法总结

前言 AutoMapper 是一个强大的对象映射库&#xff0c;用于简化和自动化复杂对象之间的转换。 官网地址&#xff1a;AutoMapper 文档地址&#xff1a;AutoMapper — AutoMapper documentation AutoMapper是以.NET(C#)语言开发的一个轻量的处理一个实体对象到另一个实体对象之间…

论文分享 | FuzzLLM:一种用于发现大语言模型中越狱漏洞的通用模糊测试框架

大语言模型是当前人工智能领域的前沿研究方向&#xff0c;在安全性方面大语言模型存在一些挑战和问题。分享一篇发表于2024年ICASSP会议的论文FuzzLLM&#xff0c;它设计了一种模糊测试框架&#xff0c;利用模型的能力去测试模型对越狱攻击的防护水平。 论文摘要 大语言模型中…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考&#xff0c;对ES的分词进行考查&#xff0c;前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

在 CentOS 系统上直接安装 MongoDB 4.0.25

文章目录 步骤 1&#xff1a;配置 MongoDB 官方源步骤 2&#xff1a;安装 MongoDB步骤 3&#xff1a;启动 MongoDB 服务步骤 4&#xff1a;验证安装步骤 5&#xff1a;可选配置注意事项 以下是在 CentOS 系统上直接安装 MongoDB 4.0.25 的详细步骤&#xff1a; 步骤 1&#x…

Swift从0开始学习 并发性 day4

1. 异步函数和 async/await async 表示函数是异步的&#xff0c;可以执行一些耗时操作而不阻塞线程。await 用来等待异步操作的完成。它让代码看起来像是同步的&#xff0c;但实际上在异步执行。 func fetchData() async -> String {// 模拟网络请求return "Data fro…

说说数字化的误区

1.数字化是一把手工程 这是很多人的误区&#xff0c;觉得数字化要一把手参与&#xff0c;这样可以获得资源&#xff0c;权力&#xff0c;但是现实中这是不可能的 首先我们要明确&#xff0c;ceo是一把手&#xff0c;是负责战略的&#xff0c;而数字化是实实在在的战术层面的内…

MQ消息队列选型

选择合适的消息队列&#xff08;Message Queue, MQ&#xff09;对于构建高效、可靠、可扩展的分布式系统至关重要。以下是针对四种主流消息队列——Kafka、ActiveMQ、RabbitMQ和RocketMQ——的技术选型指南&#xff0c;帮助您根据项目需求做出最佳选择。 1. Kafka 适用场景&a…

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统&#xff0c;旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色&#xff1a;求职者、招聘者以及超级管理员&#xff0c;每个角色拥有独特的功能模块&#xff0c;确保用户能够轻松完成从信息获取到最终录用的整个…

什么是 C++ 中的初始化列表?它的作用是什么?

初始化列表是在构造函数的参数列表后面&#xff0c;用冒号开头&#xff0c;接着列出成员变量的初始化表达式。作用是在对象创建时&#xff0c;对成员变量进行初始化&#xff0c;特别是对const成员变量、引用成员变量和没有默认构造函数的成员对象&#xff0c;必须使用初始化列表…

谈谈Spring的常见基础概念

文章是对Spring一些基础的底层概念进行分析&#xff0c;后续再遇到这些问题的时候&#xff0c;可以采用这些步骤进行详细解释。 一.谈谈SpringIOC的理解&#xff0c;原理与实现? 总&#xff1a; 1.控制反转&#xff1a; (1)原来的对象是由使用者来进行控制&#xff0c;有了S…

openjudge_简单英文题_07:Shortest Path

题目 07:Shortest Path 总时间限制: 1000ms 内存限制: 65536kB 描述 There is a graph with N nodes. Given the length of each edge between the nodes. Find the shortest path from S to E. 输入 First line: three positive integer number N (N < 100), S (S < N…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip&#xff1a; EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

oracle19c开机自启动

配置 cat > /etc/init.d/oracle19c <<EOF #!/bin/bash # Oracle startup and shutdown scriptexport ORACLE_HOME/opt/oracle/product/19c/dbhome_1 export ORACLE_SIDORCLCDB export LISTENER_NAMELISTENER # General exports and vars export PATH$ORACLE_HOME/bin…

基于xr-frame实现微信小程序的手部、手势识别3D模型叠加和石头剪刀布游戏功能

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案&#xff0c;基于混合方案实现&#xff0c;性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定&#xff0c;发布为正式版&#xff0c;但仍有一些功能还在开发&#…

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容 URBPARM_LCZ.TBL 文件的作用URBPARM_LCZ.TBL 文件中的参数URBPARM_LCZ.TBL 的使用URBPARM_LCZ.TBL 文件内容如何调整或扩展 URBPARM_LCZ.TBL参考URBPARM_LCZ.TBL 文件是 WRF(天气研究与预报模型) 中用于处理 局地气候区(Loca…

Odoo中,要实现实时数据推送,SSE 与 WebSocket 该如何选择

目录 1. 技术特点对比 2. 使用场景 适合使用 SSE 的场景&#xff1a; 适合使用 WebSocket 的场景&#xff1a; 3. 优缺点总结 SSE 优点&#xff1a; SSE 缺点&#xff1a; WebSocket 优点&#xff1a; WebSocket 缺点&#xff1a; 4. 选择建议 选择 SSE 的条件&#x…

服务器产品

一 存储产品 3.1 3PAR 3.2 X10000 3.3 SAN Switch 3.4 Nimble 3.5 SimpliVity 3.6 XP 3.7 MSA 3.8 StoreOnce 3.9 StoreEver 3.10 StoreBlade 3.11 StoreEasy&#xff08;WindowsNAS&#xff09; 3.12 JBOD 3.13 CB 二 服务器产品 4.1 红牌服务器 4.1.1 红牌…