网络运维Day10
文章目录
- SHELL基础
- 查看有哪些解释器
- 使用usermod修改用户解释器
- BASH基本特性
- shell脚本的设计与运行
- 编写问世脚本
- 脚本格式规范
- 执行shell脚本
- 方法一
- 方法二
- 实验
- 变量
- 自定义变量
- 环境变量
- 位置变量
- 案例
- 预定义变量
- 变量的扩展运用
- 多种引号的区别
- 双引号的应用
- 单引号的应用
- 反撇号或$()的应用
- read命令定义变量
- 案例
- 条件测试
- 字符串测试
- 整数值比较
- 运算
- 常量与常量的比较
- 常量与变量的比较
- 文件状态的测试
- 总结
SHELL基础
- shell是用户与linux内核之间的解释器
- shell环境准备,本实验需要用到一台虚拟机A即可
查看有哪些解释器
[root@som ~]# cat /etc/shells #查看shell解释器
使用usermod修改用户解释器
[root@som ~]# usermod -s /bin/tcsh test #使用usermod指令修改用户解释器
[root@som ~]# grep test /etc/passwd #从/etc/passwd过滤test用户信息
BASH基本特性
查看
[root@som ~]# ls #数据有颜色区分
重定向
覆盖重定向
[root@som ~]# ls > a.txt
[root@som ~]# cat a.txt
追加重定向
[root@som ~]# ls >> a.txt
[root@som ~]# cat a.txt
显示一个错误的文件
[root@som ~]# ls xxyyzz.txt
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[root@som ~]# ls xxyyzz.txt > b.txt #失败,> 收集正确信息
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[root@som ~]# ls xxyyzz.txt 2> b.txt #正确,2> 收集错误信息
[root@som ~]# cat b.txt
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
收集正确和错误的信息
[root@som ~]# ls a.txt xxyzz.txt > b.txt
[root@som ~]# ls a.txt xxyzz.txt &> b.txt #收集所有信息
[root@som ~]# cat b.txt
ls: 无法访问xxyzz.txt: 没有那个文件或目录
a. txt
管道
[root@som ~]# ifconfig | head -2 #查看ip信息前两行
快捷键与Tab键补齐,常见快捷键如表所示
shell脚本的设计与运行
什么是shell脚本
- Shell脚本是一种自动化执行任务的脚本语言,可以帮助我们完成日常任务,比如文件管理、进程管理等。
- 脚本可以理解为功能性文件
编写问世脚本
[root@som ~]# mkdir -p /root/shell/day0{1..2}
[root@som ~]# vim /root/shell/day01/first.sh
echo "Hello World"
[root@som ~]# chmod +x /root/shell/day01/first.sh #添加执行权限
[root@som ~]# /root/shell/day01/first.sh #绝对路径形式执行
Hello World
[root@som ~]# cd /root/shell/day01/ #切换目录
[root@som day01]# ./first.sh #相对路径执行
Hello World
脚本格式规范
- 脚本声明(需要的解释器、作者信息等)
- 注释信息(步骤、思路、用途、变量含义等)
- 可执行语句(操作代码)
优化刚刚的first.sh脚本
[root@som day01]# vim /root/shell/day01/first.sh
#!/bin/bash #指定解释器
#This a test program for shell. #这是一个测试性的程序
echo "Hello World"
[root@som day01]# ./first.sh #执行脚本
执行shell脚本
执行脚本的多种方式
方法一
脚本在执行的时候要有执行(x)权限,否则会报错
[root@som day01]# chmod -x first.sh
[root@som day01]# ./first.sh #报错
-bash: ./first.sh: 权限不够
[root@som day01]# /root/shell/day01/first.sh #报错
-bash: /root/shell/day01/first.sh: 权限不够
方法二
不需要文件有可执行权限,指定解释器执行脚本
[root@som day01]# sh first.sh #指定sh来执行first.sh
[root@som day01]# bash first.sh #指定bash解释器执行first.sh
实验
[root@som day01]# vim tmp.sh #编写tmp.sh
#!/bin/bash
exit
[root@som day01]# sh tmp.sh #指定运行脚本,没有关闭终端
[root@som day01]# vim tmp.sh #编写tmp.sh
#!/bin/bash
exit
[root@som day01]# source tmp.sh #执行tmp.sh,会关闭终端
总结:
- 指定解释器会新开子进程
- 使用source不会新开子进程
变量
自定义变量
- 环境变量(变量名通常大写,有操作系统维护)
- 位置变量(bash内置变量,存储脚本执行时的参数)
- 预定义变量(bash内置变量,可以调用但是不能赋值或修改)
- 自定义变量(用户自主设置)
定义变量
- 可以是数字,字母,下划线
- 变量名不能使用特殊符号,会报错
- 不能以数字开头
查看变量
echo ${变量名}
echo $变量名
定义变量
[root@som ~]# a=11
[root@som ~]# echo $a #调用变量,查看变量的值
[root@som ~]# a=33 #变量名已经存在,再次赋值,里面的内容会被覆盖
[root@som ~]# echo $a #调用变量,查看变量的值
[root@som ~]# a)=11 #变量包含特殊符号,所以定义失败
-bash: 未预期的符号 `)' 附近有语法错误
[root@som ~]# 3a=33 #变量数字开头,所以定义失败
bash: 3a=33: 未找到命令...
[root@som ~]# a_0=11 #没有违规,所以成功
[root@som ~]# _a=11 #没有违规,所以成功
[root@som ~]# _0=11 #没有违规,所以成功
[root@som ~]# x=CentOS
[root@som ~]# echo $x #成功
[root@som ~]# echo ${x} #成功
若想要显示CentOS7.9
[root@som ~]# echo $x7.9 #失败,会显示.9,此时是把$x7看成一个变量名
加上{}可以成功
[root@som ~]# echo ${x}7.9 #输出CentOS7.9
[root@som ~]# echo ${x}7.6 #输出CentOS7.6
取消变量
[root@som ~]# unset x #取消变量
[root@som ~]# echo $x
环境变量
- 存储在/etc/profile或~/.bash_profile
- 命令env可以列出所有环境变量
- 环境变量通常是大写字母
[root@som ~]# echo $PATH #命令搜索的路径变量
[root@som ~]# echo $PWD #返回当前工作目录
/root
[root@som ~]# echo $USER #显示当前登录的用户
root
[root@som ~]# echo $UID #显示当前用户的uid
0
[root@som ~]# echo $HOME #显示当前用户的家目录
/root
[root@som ~]# echo $SHELL #显示当前的SHELL
/bin/bash
位置变量
- 存储脚本时执行的参数
- $1 $2 $3 …$9 ${10} ${11} … #从10开始位置变量需要加{}
[root@som ~]# vim /root/shell/day01/vars.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@som ~]# chmod +x /root/shell/day01/vars.sh
[root@som ~]# /root/shell/day01/vars.sh aa bb cc #执行脚本,传递参数
aa
bb
cc
案例
- 编写一个user.sh脚本,使用它创建用户
[root@som ~]# vim /root/shell/day01/user.sh
#!/bin/bash
useradd "$1" #创建用户
echo "$2" | passwd --stdin $1 #设置密码
[root@som ~]# chmod +x /root/shell/day01/user.sh
[root@som ~]# /root/shell/day01/user.sh tom 123 #执行脚本
[root@som ~]# /root/shell/day01/user.sh jim 123 #执行脚本
预定义变量
- 用来保存脚本程序的执行信息,可以直接使用这些变量,但是不能为这些变量赋值
$?:执行上一条命令的返回状态,0为正确,非0为错误
[root@som ~]# ls /etc/hosts #执行命令成功
/etc/hosts
[root@som ~]# echo $? #返回值为0,正确
0
[root@som ~]# ls /xxxxxyyyy #执行命令错误
ls: 无法访问/xxxxxyyyy: 没有那个文件或目录
[root@som ~]# echo $? #返回值为非0,失败
2
其他几个预定义变量的测试
[root@som ~]# vim /root/shell/day01/pre.sh
#!/bin/bash
echo $0 #执行脚本的名字
echo $$ #当前脚本的进程号
echo $# #位置变量的个数
echo $* #所有位置变量
[root@som7 ~]# chmod +x /root/shell/day01/pre.sh
[root@som7 ~]# /root/shell/day01/pre.sh a b c d
/root/shell/day01/pre.sh
46608
4
a b c d
变量的扩展运用
多种引号的区别
双引号的应用
- 使用双引号可以界定一个完整字符串。
[root@som ~]# touch a b c #创建了三个文件
[root@som ~]# touch "a b c" #创建1一个文件
[root@som ~]# ls -l
[root@som ~]# rm -rf a b c #删除三个文件
[root@som ~]# rm -rf "a b c" #删除一个文件
单引号的应用
- 界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。
- 当双引号里面有变量时,会被扩展出来,也就是会取变量的值
[root@som ~]# hi="world"
[root@som ~]# echo "$hi" #成功
world
[root@som ~]# echo '$hi' #失败,当成一个字符串
$hi
当没有特殊符号时,单引号和双引号的含义是一样的
[root@som ~]# touch "a b c"
[root@som ~]# touch 'c d e'
练习单引号和双引号的区别
[root@som ~]# echo "$USER id is $UID" #调用变量
root id is 0
[root@som ~]# echo '$USER id is $UID' #不调用变量
$USER id is $UID
反撇号或$()的应用
- 使用反撇号``或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。
[root@som ~]# grep root /etc/passwd
[root@som ~]# test=`grep root /etc/passwd` #定义变量,内容为命令输出结果
[root@som ~]# echo $test
[root@som ~]# test2=$(grep root /etc/passwd) #定义变量,内容为命令输出结果
[root@som ~]# echo $test2
read命令定义变量
- 使用read命令从键盘读取变量值
-p
: 指定提示信息-s
: 屏蔽输入(键盘输入内容,在屏幕上不显示)-t
: 可指定超时秒数(指定秒数不输入,直接退出)
read基本用法
- 执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量:
[root@som ~]# read iname #定义变量iname
123 #从键盘输入123作为iname的值
[root@som ~]# echo $iname #输出变量iname
123
虽然可以赋值。但是屏幕上没有任何提示信息,在未来写脚本的时候不太方便,可以加上-p选项,给出提示
[root@som ~]# read -p "请输入用户名:" iname #定义变量
请输入用户名:tom
[root@som ~]# echo $iname #输出变量
tom
案例
创建一个脚本,通过read定义变量创建用户,更改密码
[root@som ~]# vim /root/shell/day01/read.sh
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" pass
useradd $name
echo "$pass" | passwd --stdin $name
[root@som ~]# chmod +x /root/shell/day01/read.sh
[root@som ~]# /root/shell/day01/read.sh
请输入用户名:user2
请输入密码:a
更改用户 user2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
但是此时密码是名为显示的,不安全,可以使用-s参数,不显示终端输入的信息
[root@som ~]# vim /root/shell/day01/read.sh
read -p "请输入用户名:" name
read -s -p "请输入密码:" pass
useradd $name
echo "$pass" | passwd --stdin $name
[root@som ~]# /root/shell/day01/read.sh
请输入用户名:user3
请输入密码:
更改用户 user3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@som ~]# read -t 3 iname #3秒不输入直接退出
条件测试
- 语法格式:使用 [ 表达式 ],表达式两边至少要留一个空格。
字符串测试
- 是否为空 [ -z 字符串 ]
[root@som ~]# echo $TT
[root@som ~]# [ -z $TT ] #T为空吗
[root@som ~]# echo $? #是,返回值为0
0
[root@som ~]# TT="hello"
[root@som ~]# [ -z $TT ] #T为空吗
[root@som ~]# echo $? #否,返回值非0
1
等于:[ 字符串1 == 字符串2 ]
[root@som ~]# [ a == a ] #判断a==a
[root@som ~]# echo $? #查看返回值
0
[root@som ~]# [ a == c ] #判断a==c
[root@som ~]# echo $? #查看返回值
1
变量和常量的判断
[root@som ~]# [ $USER == root ] #环境变量USER的值是root吗
[root@som ~]# echo $?
0
[root@som ~]# [ $USER == tom ] #环境变量USER的值是tom吗
[root@som ~]# echo $?
1
不等于:[ 字符串1 != 字符串2 ]
[root@som ~]# [ $USER != tom ] #环境变量USER的值不是tom
[root@som ~]# echo $?
0
整数值比较
格式:[ 整数值1 操作符 整数值2 ]
-eq
:等于-ne
:不等于-gt
:大于-ge
:大于等于-lt
:小于-le
:小于等于
参与比较的必须是整数(可以调用变量),比较非整数值时会出错:
运算
四则运算:+ - * /
求模取余:%
计算练习
[root@som ~]# echo $[1+1] #计算1+1
[root@som ~]# echo $[10-2] #计算10-2
[root@som ~]# echo $[2*2] #计算2*2
[root@som ~]# echo $[6/3] #计算6/3
[root@som ~]# echo $[10%3] #取10/3的余数
变量计算
[root@som ~]# a=10
[root@som ~]# b=20
[root@som ~]# echo $[a+b] #计算变量a+变量b
常量与常量的比较
小于
[root@som ~]# [ 3 -lt 8 ]
[root@som ~]# echo $?
0
大于
[root@som ~]# [ 3 -gt 2 ]
[root@som ~]# echo $?
0
等于
[root@som ~]# [ 3 -eq 3 ]
[root@som ~]# echo $?
0
小于等于
[root@som ~]# [ 3 -le 3 ]
[root@som ~]# echo $?
0
大于等于
[root@som ~]# [ 3 -ge 1 ]
[root@som ~]# echo $?
0
常量与变量的比较
判断计算机登录的用户
[root@som ~]# who | wc -l
[root@som ~]# [ $(who | wc -l) -ge 2 ]
[root@som ~]# echo $?
0
文件状态的测试
- 格式:
[ 操作符 文件或目录 ]
-e
:判断对象是否存在(不管是目录还是文件),存在则结果为真
[root@som ~]# [ -e /etc ]
[root@som ~]# echo $?
0
[root@som ~]# [ -e /etc/hosts ]
[root@som ~]# echo $?
0
[root@som ~]# [ -e /etc/xxyy ]
[root@som ~]# echo $?
1
-d
:判断对象是否为目录(存在且是目录),是则为真
[root@som ~]# [ -d /etc/hosts ]
[root@som ~]# echo $?
1
[root@som ~]# [ -d /etc/ ]
[root@som ~]# echo $?
0
-f
:判断对象是否为文件(存在且是文件)是则为真
[root@som ~]# [ -f /etc/ ]
[root@som ~]# echo $?
1
[root@som ~]# [ -f /etc/hosts ]
[root@som ~]# echo $?
0
-r
:判断对象是否可读,是则为真
[root@som ~]# ls -l /etc/hosts
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
[root@som ~]# [ -r /etc/hosts ]
[root@som ~]# echo $?
0
-w
:判断对象是否可写,是则为真
[root@som ~]# [ -w /etc/hosts ]
[root@som ~]# echo $?
0
-x
:判断对象是否具有可执行权限,是则为真
[root@som ~]# [ -x /etc/hosts ]
[root@som ~]# echo $?
1
总结
- 掌握SHELL脚本执行流程
- 掌握SHELL中的变量
- 自定义变量
- 环境变量
- 位置变量
- 预定义变量
- 掌握SHELL中条件测试
相关文章:

网络运维Day10
文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量案例 预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()…...
@Cacheable 注解的 @CacheManager 示例
pom.xml 依赖包: <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jed…...
springboot二维码示例
pom.xml依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>…...

nacos做服务配置和服务器发现
一、创建项目 1、创建一个spring-boot的项目 2、创建三个模块file、system、gateway模块 3、file和system分别配置启动信息,并且创建一个简单的控制器 server.port9000 spring.application.namefile server.servlet.context-path/file4、在根目录下引入依赖 <properties&g…...

KCC@广州与 TiDB 社区联手—广州开源盛宴
10月21日,KCC广州与 TiDB 社区联手,在海珠区保利中悦广场 29 楼召开了一次难忘的开源盛宴。这不仅仅是 KCC广州的又一次线下见面,更代表着与 TiDB 社区及广州技术社区的首次深度合作。 活动的策划与组织由 KCC广州负责人 - 惠世冀、PingCAP 的…...

CSS3 分页、框大小、弹性盒子
一、CSS3分页: 网站有很多个页面,需要使用分页来为每个页面做导航。示例: <style> ul.pagination { display: inline-block; padding: 0; margin: 0; } ul.pagination li {display: inline;} ul.pagination li a { color: black; f…...
GEE问题——GEE中循环的使用map()函数,以提取指定范围内的逐日的二氧化氮平均浓度为例
问题: 我有一个简单的代码,可以帮助计算德克萨斯州每个县的对流层二氧化氮平均浓度。目前,我可以将其导出为我指定的任何日期范围的 csv 表,但我想 1) 提取每天平均值,例如 3 个月(2020 年 3 月至 2020 年 5 月,约 90 天)--手动多次运行肯定不是办法,而且我的编码技…...

短信验证码实现(阿里云)
如果实现短信验证,上教程,这里用的阿里云短信服务 短信服务 (aliyun.com) 进入短信服务后开通就行,可以体验100条免费,刚好测试用 这里由自定义和专用,测试的话就选择专用吧,自定义要审核, Se…...
如何对element弹窗进行二次封装
方式一使用$refs 个人比较喜欢用这种的 通过$refs打开的同时 还能给弹窗组件传参 一些框架使用的也是这种方式 父组件 <template><div><el-button type"text" click"handleDialogOpen">打开嵌套表单的 Dialog</el-button><Dia…...

【微服务专题】手写模拟SpringBoot
目录 前言阅读对象阅读导航前置知识笔记正文一、工程项目准备1.1 新建项目1.1 pom.xml1.2 业务模拟 二、模拟SpringBoot启动:好戏开场2.1 启动配置类2.1.1 shen-base-springboot新增2.1.2 shen-example客户端新增启动类 三、run方法的实现3.1 步骤一:启动…...

七个优秀微服务跟踪工具
随着微服务架构复杂性的增加,在问题出现时确定问题的根本原因变得更具挑战性。日志和指标为我们提供了有用的信息,但并不能提供系统的完整概况。这就是跟踪的用武之地。通过跟踪,开发人员可以监控微服务之间的请求进度,从而使他们…...
redis 问题解决 1
1.1 常见考点 1、Redis 为何这么快? Redis 是一款基于内存的数据结构存储系统,它之所以能够提供非常快的读写性能,主要是因为以下几个方面的原因: 基于内存存储:Redis 所有的数据都存储在内存中,而内存的访问速度比磁盘要快得多。因此,Redis 可以提供非常快的读写性能…...
odoo16前端框架源码阅读——启动、菜单、动作
odoo16前端框架源码阅读——启动、菜单、动作 目录:addons/web/static/src 1、main.js odoo实际上是一个单页应用,从名字看,这是前端的入口文件,文件内容也很简单。 /** odoo-module **/import { startWebClient } from "…...

C/C++(a/b)*c的值 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C(a/b)*c的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C(a/b)*c的值 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定整数a、b、c,计算(a / b)*c的值&…...

CIFAR-100数据集的加载和预处理教程
一、CIFAR-100数据集介绍 CIFAR-100(Canadian Institute for Advanced Research - 100 classes)是一个经典的图像分类数据集,用于计算机视觉领域的研究和算法测试。它是CIFAR-10数据集的扩展版本,包含了更多的类别,用…...

C#,数值计算——函数计算,Eulsum的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Eulsum { private double[] wksp { get; set; } private int n { get; set; } private int ncv { get; set; } public bool cnvgd { get; set; } pri…...

ChatGLM3 langchain_demo 代码解析
ChatGLM3 langchain_demo 代码解析 0. 背景1. 项目代码结构2. 代码解析2-1. utils.py2-2. ChatGLM3.py2-3. Tool/Calculator.py2-4. Tool/Weather.py2-5. main.py 0. 背景 学习 ChatGLM3 的项目内容,过程中使用 AI 代码工具,对代码进行解释,…...

asp.net学院网上报销系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net学院网上报销系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 asp.net学院网上报销系统 应用技术…...

ElasticSearch知识点
什么是ElasticSearch ElasticSearch: 智能搜索,分布式的搜索引擎,是ELK的一个非常完善的产品,ELK代表的是: E就是ElasticSearch,L就是Logstach,K就是kibana Elasticsearch是一个建立在全文搜索引擎 Apache Lucene基础…...

STM32 GPIO
STM32 GPIO GPIO简介 GPIO(General Purpose Input Output)通用输入输出口,也就是我们俗称的IO口 根据使用场景,可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 数据0就是低电平,…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...