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
逻辑操作符/布尔运算符
符号
例:
[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
示例:
// 如果目录/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
总结:
- 文件测试
- 算数运算符
- 字符串运算符 -n
- 关系型运算符
- 逻辑运算符
相关文章:

RHCE的学习(21)
第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…...

Ubuntu 18.04 配置sources.list源文件(无法安全地用该源进行更新,所以默认禁用该源)
如果你 sudo apt update 时出现诸如 无法安全地用该源进行更新,所以默认禁用该源 的错误,那就换换源吧,链接: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/ 注意版本: 修改源文件: sudo nano /etc…...

19.UE5道具掉落
2-21 道具掉落,回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建,道具功能的实现 2.随机掉落 1.道具的创建,道具功能的实现 新建Actor蓝图,并命名为道具总类,添加一个Niagara粒子组件和一个碰撞箱bo…...

MySQL —— MySQL逻辑架构与查询过程
文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校…...

ODOO学习笔记(12):自定义模块开发
一、Odoo模块结构基础 基本目录结构 Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹: __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. impo…...

Excel单元格中自适应填充多图
实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…...

20.useMediaQuery
React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…...

无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:无人机场景车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…...

聚合查询(查询)
count:统计表中所有的行数 指定某一列不统计NULL sum:求和 NULL值不参与计算(省略) avg():对所有行的指定列求平均值 max() min():求所有指定行中最大值与最小值 分组查询 group by: ROUDN()小数点 havin…...

QT QLineEdit失去焦点事件问题与解决
本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题! 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…...

Remora
Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…...

MySQL中将一个字符串字段按层级树状展开
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式: 1.分析 1.他的层级个数是不确定的,也就是说有的有2层有的有5…...

vue面试题8|[2024-11-14]
问题1:什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库,比如我再添加一个router或者vuex,不断让项目壮大,就是渐进式框…...

ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型
本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…...

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH(广义自回归条件异方差)模型计算VaR(风险价值)时,方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...

深入Linux基础:文件系统与进程管理详解
在Linux运维领域,文件系统和进程管理是两个至关重要的基础知识。理解它们的原理和实际操作,不仅有助于我们更高效地管理服务器,还能快速定位问题、优化性能。本文将带你全面了解这两大模块,并配以示例代码进行讲解,帮助…...

缓存及其不一致
在实际开发过程中,一般都会遇到缓存,像本地缓存(直接在程序里搞个map也可以,但是可能会随着数据的增长出现OOM,建议使用正经的本地缓存框架,因为自己实现淘汰策略啥的挺费劲的)、分布式缓存&…...

Leetcode 有效的数独
这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…...

《Java核心技术 卷I》用户界面中首选项API
首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…...

Android 中的 Zygote 和 Copy-on-Write 机制详解
在 Android 系统中,Zygote 是一个关键的进程,几乎所有的应用进程都是通过它 fork(派生)出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势,这得益于 fork 操作和 Linux 中的 Copy-on-Write(COW&am…...

【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 逻辑回归是一种经典的统计学习方法,用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...

推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic
Readiris Dyslexic是一款功能强大的光学识别OCR软件,可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word,Excel,PDF),然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建,修改和签名PDF的完整解决方法&…...

Python爬虫----python爬虫基础
一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...

css-50 Projects in 50 Days(3)
html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…...

另外一种缓冲式图片组件的用法
文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…...

字节青训-小C的外卖超时判断、小C的排列询问
目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、小C的排列询问 问题描述 测试样例 最终代码: 运行结果: 编辑 一、小C的外卖超时判断…...

PHP 伪静态详解及实现方法
概述 在现代 Web 开发中,URL 的设计对用户体验和搜索引擎优化(SEO)至关重要。动态 URL 虽然功能强大,但往往显得冗长且不友好。伪静态(URL 重写)技术通过将动态 URL 转换为静态样式,不仅提高了…...

Spring Boot 简单预览PDF例子
目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目,你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...