【Bash/Shell】知识总结
文章目录
- 1. 总体认识
- 1.1. Shell概述
- 1.2. 第一个Shell脚本
- 1.3. 注释
- 2. 变量
- 2.1. 定义变量
- 2.2. 使用变量
- 2.3. 只读变量
- 2.4. 删除变量
- 2.5. 变量类型
- 2.5.1. 字符串变量
- 2.5.2. 整数变量
- 2.5.3. 数组变量
- 2.5.4. 环境变量
- 2.5.5. 特殊变量
- 3. 输出
- 3.1. echo命令
- 3.2. printf命令
- 4. 运算符
- 4.1. 运算表达式
- 4.2. 条件表达式
- 4.2.1. 关系运算符
- 4.2.2. 逻辑运算符
- 4.2.3. 字符串运算符
- 4.2.4. 文件测试运算符
- 5. 流程控制
- 5.1. 条件语句
- 5.1.1. if语句
- 5.1.2. case多选择语句
- 5.2. 循环语句
- 5.2.1. for循环
- 5.2.2. while循环
- 5.2.3. 无限循环
- 5.2.4. until循环
- 5.2.5. 跳出循环
- 6. 函数
- 7. 输入输出重定向
- 8. 文件包含
- 9. 常用shell命令
- 9.1. alias
1. 总体认识
1.1. Shell概述
- Shell是一个用C语言编写的程序,这个程序提供了一个界面,用户通过这个界面可以访问操作系统内核的服务。
- Shell既是一种命令语言,又是一种解释型的程序设计语言。
- Shell脚本(shell script),是一种为shell编写的脚本程序。
- Shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
- Linux的Shell种类众多,常用的有Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)等等,其中Bourne Again Shell是Bourne Shell的增强版本,兼容性更好,且提供了更多的特性和功能。由于易用和免费,Bash是大多数Linux系统默认的Shell。
1.2. 第一个Shell脚本
- 文件名:test.sh
#!/bin/bash echo "Hello World!"- shell脚本名:
*.sh。 - 第一行使用
#!指定解释器路径。 - 第二行
echo语句的作用是在终端显示指定内容。
- shell脚本名:
- 运行Shell脚本
- 作为可执行程序
chmod +x ./test.sh # 使脚本具有执行权限 ./test.sh # 执行脚本- 作为解释器参数
bash test.sh
1.3. 注释
- 单行注释:以
#开头的行会被解释器忽略。 - 多行注释
:<<EOF
Here文档中的内容不会被执行
EOF: << delimiterdocument
delimiter:'
冒号代表空命令,后面的内容不会执行
'
2. 变量
变量是存储的数据值的名称。
2.1. 定义变量
variable=value
- 注意:变量名和等号之间不能有空格。
- 变量命名要求:
- 只由字母、数字和下划线组成,不能以数字开头。
- 避免使用Shell关键字。
- 习惯上,常量的变量名通常使用大写字母
2.2. 使用变量
variable=value
echo $variable
echo ${variable}
- 变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。
- 已定义的变量,可以被重新定义。
variable=value1 echo $variable variable=value2 echo $variable
2.3. 只读变量
variable=value
readonly variable
2.4. 删除变量
variable=value
unset variable
- 变量被删除后不能再次使用。
- unset 命令不能删除只读变量。
2.5. 变量类型
2.5.1. 字符串变量
str1=hello
str2='hello'
str3="hello"
- 变量通常被视为字符串。
- 可以使用单引号 ’ 或双引号 " 来定义字符串
- 单引号字符串的限制
- 单引号字符串里的任何字符都会原样输出,不能进行变量值的替换。
- 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号字符串
name="world" str="\"Hello,$name! \"\n" echo -e $str- 双引号字符串中可以进行值的替换。
- 双引号字符串中可以出现转义字符。
- 使用echo语句显示
\n要添加参数-e。
- 拼接字符串
name="world"# 使用双引号
str1="hello, "$name"!"
str2="hello, $name!" # 推荐# 使用单引号
str3='hello, '$name'!'
- 获取字符串的长度
str="hello"
echo ${#str}
echo ${#str[0]}
- 提取子字符串
str="Hello, World!"
echo ${str:1:4} # 输出ello
- 查找子字符串
str="Hello, World"# 获得字符l,o第1次出现时,已经读取的字符串部分
x=${str%%[lo]*} # x的值为He
# x的长度加1即为首次出现指定字符的索引
echo $((${#x}+1)) # 输出3
2.5.2. 整数变量
declare -i intvar=3
typeset -i intvar=3
这样的声明告诉Shell将intvar视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。
2.5.3. 数组变量
- 数组变量可以在一个变量中存储多个值。
- 整数索引数组
array1=(1 2 3 4 5) array2=("1"2"hello" ) array3[0]=value0 array3[2]=value2- 可以不使用连续的下标,而且下标的范围没有限制。
- 索引数组元素:
${数组名[索引]} - 获取所有元素:
${数组名[*]}或${数组名[@]},两者的区别是后者常用于迭代。 - 获取数组的长度:
${#数组名[*]}或${#数组名[@]} - 获取数组单个元素的长度:
${#数组名[索引]}
- 关联数组
declare -A asarray asarray["name"]="John" asarray["age"]=30declare -A site=(["google"]="www.google.com"["baidu"]="www.baidu.com" )- 键可以是任意的字符串或者整数
- 键是唯一的
- 使用键访问关联数组元素:
数组名[键] - 获得所有值:
${数组名[*]}或${数组名[@]},两者的区别是后者常用于迭代。 - 获得所有键:
${!数组名[*]}或${!数组名[@]},两者的区别是后者常用于迭代。 - 获得数组长度:
${#数组名[*]}或${#数组名[@]}
2.5.4. 环境变量
- 环境变量是由操作系统或用户设置的特殊变量,用于配置Shell的行为和影响其执行环境。
- PATH变量包含了操作系统搜索可执行文件的路径
- 将路径添加PATH
export PATH=${your_path}:$PATH- 直接在终端执行是临时设置
- 要永久设置则须写入配置文件
- 当前登陆用户配置文件:
~/.bashrc - 所有用户的配置文件:
/etc/profile - 写入后要重新加载:
source ${config_path}
- 当前登陆用户配置文件:
- 添加其他环境变量与PATH变量类似
2.5.5. 特殊变量
| 特殊变量 | 作用 |
|---|---|
$0 | 脚本名称 |
$1, $2, … | 脚本参数 |
$# | 传递给脚本的参数数量 |
$* | 以一个单字符串接收所有向脚本传递的参数 |
$@ | 以"$1" “ 2 " … " 2" … " 2"…"n” 的形式接收所有参数,常用于迭代 |
$? | 上一个命令的退出状态,0表示没有错误,其他任何值表明有错误。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
3. 输出
3.1. echo命令
- 命令格式
echo string
- 显示普通字符串
echo "It is a test"
echo It is a test
- 显示转义字符
echo "\"It is a test\""
echo \"It is a test\"
- 显示变量
# 标准输入中读取一行(不允许转义)到变量name
read -r name
echo "$name is good!"
- 显示换行
echo -e "OK! \n" # -e 开启转义
echo "******"
- 显示不换行
echo "OK! \n" # 原样输出\n
echo "******"
echo -e "OK! \c" # -e 开启转义,但不换行
echo "******"
- 原样输出字符串
echo '$name\"'
- 显示命令执行结果
echo "Date: $(date)"
3.2. printf命令
printf命令模仿C程序库里的printf()函数。- 命令格式
printf format-string [arguments...]
- 格式化字符串参照C语言
- 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,
format-string被重用 - 如果没有
arguments,那么%s用NULL代替,%d用0代替 - 格式化字符串中的
%b格式- 用于参数中存在
\n时,输出换行。用%s会原样输出\n。 - 仅在
%b格式下,\c可以抑制(不显示)输出结果中任何结尾的换行字符,而且其后的所有内容全部忽略。用%s会原样输出\c。
- 用于参数中存在
4. 运算符
4.1. 运算表达式
- 运算表达式的使用
val=$((2 + 2)) echo "$val"$((...))中不用考虑空格的问题,变量不用加$号。- 支持的运算
运算符 含义 举例 +加法 $((a + b))-减法 $((a - b))*乘法 $((a * b))/除法 $((a / b))%取余 $((a % b))++自增,与C++相同 $((a++))--自减,与C++相同 $((a--))=赋值,右值作为结果 $((a = b))==比较相等,相等为1,否则为0 $((a - b))!=比较不相等,不相等为1,否则为0 $((a - b))>比较大于,大于为1,否则为0 $((a - b))<比较小于,小于为1,否则为0 $((a - b))>=比较大于等于,大于等于为1,否则为0 $((a - b))<=比较小于等于,小于等于为1,否则为0 $((a - b))
4.2. 条件表达式
- 条件表达式的使用
a=2 b=1if test $a -eq $b thenecho "相等" elif [ $a -ge $b ] thenecho "大于" elif (($a < $b))echo "小于" elseecho "错误" fi- 条件表达式通常用于流程控制中
- 条件判断可以使用
test 条件表达式 - 条件判断可以使用
[ 条件表达式 ],注意要有空格 - 条件判断可以使用
((条件表达式)),此时可以不用考虑空格
4.2.1. 关系运算符
只支持数字,不支持字符串。
| 运算符 | 含义 | 举例 |
|---|---|---|
-eq | 检测两个数是否相等,相等返true。 | [ $a -eq $b ] |
-ne | 检测两个数是否不相等,不相等返回true。 | [ $a -ne $b ] |
-gt | 检测两个数是否大于右边的,如果是,则返回true。 | [ $a -gt$b ] |
-lt | 检测两个数是否小于右边的,如果是,则返回true。 | [ $a -lt $b ] |
-ge | 检测两个数是否大于等于右边的,如果是,则返回true。 | [ $a -ge $b ] |
-le | 检测两个数是否小于等于右边的,如果是,则返回true。 | [ $a -le $b ] |
4.2.2. 逻辑运算符
优先级:! > && > ||,存在短路运算。
| 运算符 | 含义 | 举例 |
|---|---|---|
&& | 逻辑与运算 | [[ $a -lt 100 && $b -gt 15 ]] |
|| | 逻辑或运算 | [[ $a -lt 100 || $b -gt 15 ]] |
! | 逻辑非运算 | [[ ! $a -lt 100 ]] |
4.2.3. 字符串运算符
| 运算符 | 含义 | 举例 |
|---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] |
-n | 检测字符串长度是否不为0,不为0返回 true。 | [ -n $a ] |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] |
4.2.4. 文件测试运算符
用于检测Unix文件的各种属性。
| 运算符 | 含义 | 举例 |
|---|---|---|
-b | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] |
-c | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] |
-d | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] |
-f | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] |
-g | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] |
-k | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] |
-p | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] |
-u | 检测文件是否设置了SUID位,如果是,则返回 true。 | [ -u $file ] |
-r | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] |
-w | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] |
-x | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] |
-s | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] |
-e | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] |
-S | 判断某文件是否 socket。 | [ -S $file ] |
-L | 检测文件是否存在并且是一个符号链接。 | [ -L $file ] |
5. 流程控制
5.1. 条件语句
5.1.1. if语句
- 最展开的格式
if 条件判断
then命令1命令2...
elif 条件判断
then命令1命令2...
else命令1命令2...
fi
- 写成一行要加分号分隔
if 条件判断; then 命令; fi
if 条件判断; then命令1命令2...
fi
5.1.2. case多选择语句
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;*)command1command2...commandN;;
esac
5.2. 循环语句
5.2.1. for循环
- 最展开的格式
for var in item1 item2
do命令1命令2...
done
- 写成一行要加分号分隔
for var in item1 item2; do 命令1; 命令2; done
5.2.2. while循环
- 一般格式
while 条件判断
do命令1命令2...
done
- 循环读取键盘输入
while read -r site
doecho "是的!$site 是一个好网站"
done
5.2.3. 无限循环
while true
do命令
done
5.2.4. until循环
先执行,再判断
until 条件判断
do命令
done
5.2.5. 跳出循环
break是跳出本级循环continue跳出本次循环
6. 函数
- 格式
function funname [()]
{action[return int;]
}[ function ] funname ()
{action[return int;]
}
- 所有函数在使用前必须定义。
- 调用函数仅使用其函数名即可。
- 返回值
- 如果不return语句,将以最后一条命令运行结果作为返回值。
- 只能返回0-255。
- 函数返回值在调用该函数后通过
$?来获得。
- 函数参数与脚本的命令行参数相同
7. 输入输出重定向
- 文件描述符
- 0表示标准输入(STDIN)
- 1表示标准输出(STDOUT)
- 2表示标准错误输出(STDERR)
- 空设备文件nul(指向/dev/null)
- 输出重定向到文件,覆盖原文件。
command > file - 输出以追加的方式重定向到文件
command >> file - 合并标准输出和标准错误输出,并重定向到文件
command > file 2>&1 - 错误输出重定向到文件
command 2> file - 将输入重定向为文件
command < file - Here文档:将输入重定向为两个分隔符之间的内容
command << delimiterdocument delimiter - 对标准输入和标准输出都进行重定向
command < file1 > file2 - 屏蔽命令输出
command > nul command > /dev/null
8. 文件包含
. filename # 注意有空格
source filename
上述语句会先执行指定shell脚本,但是保留shell脚本执行结束会清理的变量等内容
9. 常用shell命令
9.1. alias
- 用于设置指令的别名
- 语法
alias [别名]="[指令名称]"
- 注意多条指令用分号分隔
相关文章:
【Bash/Shell】知识总结
文章目录 1. 总体认识1.1. Shell概述1.2. 第一个Shell脚本1.3. 注释 2. 变量2.1. 定义变量2.2. 使用变量2.3. 只读变量2.4. 删除变量2.5. 变量类型2.5.1. 字符串变量2.5.2. 整数变量2.5.3. 数组变量2.5.4. 环境变量2.5.5. 特殊变量 3. 输出3.1. echo命令3.2. printf命令 4. 运算…...
单例模式(C++实现)
RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别 线程安全与STL与其他锁...
ElasticSearch 聚合统计
聚合统计 度量聚合:求字段的平均值,最小值,最大值,总和等 桶聚合:将文档分成不同的桶,桶的划分可以根据字段的值,范围,日期间隔 管道聚合:在桶聚合的结果上执行进一步计…...
SpringIOC之MethodBasedEvaluationContext
博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...
【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手
前言 TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。在建立 TCP 连接时,需要进行三次握手,防止因为网络延迟、拥塞等原因导致的数据丢失或错误传输,确保双方都能够正常通信。 TCP三次握手在Wireshark数据包中…...
钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024发酵展
钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024济南生物发酵展! 展位号:2号馆A65展位 2024第12届国际生物发酵产品与技术装备展览会(济南)于3月5-7日在山东国际会展中心盛大召开,展会同期将举办30余场高质…...
Python模拟动态星空
前言 今天,我们来用Python做个星空。 一、模拟星空 1,.首先导入所需要的库: from turtle import * from random import random, randint 2.初始画面: screen Screen() width, height 800, 600 screen.setup(width, height) screen.tit…...
最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)
最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)。 什么是推流? 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源…...
shell ——数组
数组中可以存放多个值,Bash Shell只能支持以为数字,初始化时不需要定义数组大小。 数组中元素下标从0开始。 数组的定义 shell数组用括号来表示,元素用空格分割开。 array_name(value1 value2 value3 ...) 给一个简单数组例子 cat firs…...
GO语言基础笔记(五):包的介绍
在Go语言中,包(package)是代码组织和重用的基本单位。Go的标准库中包含了许多实用的包,它们提供了从基础数据处理到复杂网络编程等各种功能。下面是一些常用的Go标准库包及其作用的介绍: 目录 1. fmt 2. net/http …...
【Unity6.0+AI】Sentis加载模型识别手写数字案例实现
按照国际惯例,看效果: 素材准备: 自己在PS中绘制黑底白字手写字体,导出jpg,尺寸28*28! 素材设置 基本步骤 准备工作:从 ONNX Model Zoo 下载手写识别 ONNX 模型文件 【下载模型】MNIST 手写数字识别模型 mnist-12.onnx,并将其拖入项目窗口的 Assets 文件夹。 【下载模…...
VScode跑通Remix.js官方的contact程序开发过程
目录 1 引言 2 安装并跑起来 3 设置根路由 4 用links来添加风格资源 5 联系人路由的UI 6 添加联系人的UI组件 7 嵌套路由和出口 8 类型推理 9 Loader里的URL参数 10 验证参数并抛出响应 书接上回,我们已经跑通了remix的quick start项目,接下…...
讲座思考 | 周志华教授:新型机器学习神经元模型的探索
12月22日,有幸听了南京大学周志华教授题为“新型机器学习神经元模型的探索”的讲座。现场热闹非凡,大家像追星一样拿着“西瓜书”找周教授签名。周教授讲得依旧循循善诱,由浅入深,听得我很入迷,故作此记。 周教授首先就…...
docker构建镜像及项目部署
文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件,完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…...
ARM串口通信编程实验
完成:从终端输入选项,完成点灯关灯,打开风扇关闭风扇等操作 #include "gpio.h" int main() {char a;//char buf[128];uart4_config();gpio_config();while(1){//接收一个字符数据a getchar();//发送接收的字符putchar(a);switch(…...
MyBatis的延迟加载(懒加载)
MyBatis 中的延迟加载是指在需要时才加载对象的某些属性或关联对象,而不是在初始查询时就加载所有数据。这对于性能优化和减少不必要的数据库查询非常有用。 1. 基于配置文件的延迟加载 在 MyBatis 的 XML 映射文件中,你可以使用 lazyLoadingEnabled 和…...
嵌入式-stm32-用PWM点亮LED实现呼吸灯
一:知识前置 1.1、LED灯怎么才能亮? 答:LED需要低电平才能亮,高电平是灯灭。 1.2、LED灯为什么可以越来越亮,越来越暗? 答:这是用到不同占空比来实现的,控制LED实现呼吸灯&…...
C语言初学7:循环
while 循环 一、while 循环语法: while(condition) {statement(s); } condition 为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。 二、while 循环举例 #inc…...
力扣69. x 的平方根
二分查找 思路: 设置 left 指针为 0,right 指针为 x;如果 mid (right - left) / 2 left 的平方小于或等于 x,此时移动 left mid 1,并缓存当前 mid 值,可能这个 mid 就是结果,或者 x 的平方…...
go语言学习计划。
第1周:Go语言概述与环境搭建 内容:了解Go语言的历史、特点和应用场景。安装Go环境,配置工作区。实践:编写第一个Go程序,了解Go的编译运行流程。 第2周:基本语法与数据类型 内容:学习基本数据…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
