shell 编程
文章目录
- 一、shell 编程
- 1.1. 脚本执行
- 1.2. 变量
- 1.3. 特殊变量
- 1.4. 运算符
- 1.5. for 循环
- 1.6. while 循环
- 1.7. case 语句
- 1.8. read 命令
- 1.9. if 判断
- 1.10. 判断语句
- 1.11. 自定义函数
- 1.12. 脚本调试
- 二、sed
- 2.1. sed 选项
- 2.2. sed function
- 2.3. sed 删除(d 命令)
- 2.4. sed 替换(s 命令)
- 2.5. 多点编辑(e 命令)
- 2.6. 插入(i 命令)
- 三、awk
- 3.1. 三种调用方式
- 3.2. 实例
- 3.3. 内置变量
- 3.4. awk 编程
- 3.5. 参考
- 四、自动化部署脚本
- 4.1. 安装 jdk
- 4.2. ssh 免密
一、shell 编程
1.1. 脚本执行
# 1. 输入脚本绝对路径或相对路径,需要先添加脚本的执行权限(+x)
./case.sh
/root/case.sh# 2. 用解释器执行脚本
sh case.sh# 3. 在脚本的路径前再加 ‘.’,1和2 会新开一个 bash,变量不共享,3 不会新开 bash
./root/case.sh
../case.sh
1.2. 变量
1. 变量=值 (例如STR=abc)
2. 等号两侧不能有空格
3. 变量名称一般习惯为大写
4. 双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
STR="hello world"
A=9
unset A # 撤销变量 A
readonly B=2 # 声明静态的变量 B=2 ,不能 unset
export A # export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用# 将命令的返回值赋给变量
A=`ls -la` # 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) # 等价于反引号
1.3. 特殊变量
$? # 表示上一个命令退出的状态
$$ # 表示当前进程编号
$0 # 表示当前脚本名称
$n # 表示n位置的输入参数(n代表数字,n>=1)
$# # 表示参数的个数,常用于循环
$* # 表示参数列表
$@ # 和 $*都表示参数列表
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数;
当它们被双引号" “包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n"的形式输出所有参数;"n"的形式输出所有参数;"n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “2"…"2" … "2"…"n” 的形式输出所有参数;
1.4. 运算符
# 格式 :expr m + n 或 $((m+n)) 注意expr运算符间要有空格
# 例如计算(2 +3 )×4 的值# 分步计算
S=`expr 2 + 3`
expr $S \* 4# 一步完成计算
expr `expr 2 + 3 ` \* 4
echo `expr \`expr 2 + 3\` \* 4`
# 或
$(((2+3)*4))
1.5. for 循环
for N in 1 2 3
doecho $N
done
# 或
for N in 1 2 3; do echo $N; done
# 或
for N in {1..3}; do echo $N; donefor ((i = 0; i <= 5; i++))
doecho "welcome $i times"
done
# 或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
1.6. while 循环
while expression
do# command# …
donei=1
while ((i<=3))
doecho $ilet i++
done
1.7. case 语句
case $1 in
start)echo "starting";;
stop)echo "stoping";;
*)echo "Usage: {start|stop} "
esac
1.8. read 命令
# read -p(提示语句)-n(字符个数) -t(等待时间)
read -p "please input your name: " NAME
please input your name: aure
echo $NAME
aure
1.9. if 判断
# 语法
if condition
thenstatements
[elif conditionthen statements. ..]
[elsestatements ]
fi# if例子
#!/bin/bash
read -p "please input your name:" NAME
# printf '%s\n' $NAME
if [ $NAME = root ]
thenecho "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]thenecho "hello ${NAME}, welcome !"
elseecho "SB, get out here !"
fi
1.10. 判断语句
[ condition ] # 注意condition前后要有空格
[ test ]# 非空返回true,可使用 $? 验证(0为true,>1为false)
[ ] # 空返回false
[ condition ] && echo OK || echo notok # 条件满足,执行后面的语句
常用判断条件
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- -f 文件存在并且是一个常规的文件
- -s 文件存在且不为空
- -d 文件存在并是一个目录
- -b文件存在并且是一个块设备
- -L 文件存在并且是一个链接[外链图片转存失败,源站可能有防盗链image!机制,建png]接上传mattachment:g-e.png)attachment:image.png)]
1.11. 自定义函数
# 语法[ function ] funname [()]
{action;[return int;]
}function start() / function start / start()#!/bin/bash
fSum 3 2;
function fSum()
{echo $1,$2;return $(($1+$2));
}
fSum 5 7;
total=$?;
echo $total,$?;
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译;
- 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255);
1.12. 脚本调试
sh -vx helloWorld.sh # 或者在脚本中增加set -x
二、sed
sed 全称是:Stream EDitor即流编辑器,是一个很好的文本处理工具,本身是一个管道命令,处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行。它是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作;
2.1. sed 选项
- -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来;
- -e :直接在命令列模式上进行 sed 的动作编辑;
- -i :直接修改读取的文件内容,而不是输出到终端;
2.2. sed function
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- d :删除,因为是删除啊,所以 d 后面通常不接任何内容
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
2.3. sed 删除(d 命令)
# 删除 exp 第二行
sed '2d' exp# 删除第二到末尾的所有行
sed '2,$d' exp# 删除 exp 文件的最后一行
sed '$d' exp# 删除exp 中包含 cc 的行
sed '/cc/'d exp
2.4. sed 替换(s 命令)
# 在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
sed 's/test/mytest/g' example# (-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
sed -n 's/^test/mytest/p' example# &符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
sed 's/^192.168.0.1/&localhost/' example# love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
sed -n 's/\(love\)able/\1rs/p' example# 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
sed 's#10#100#g' example# 选定行的范围:逗号
sed -n '/test/,/check/p' example # 所有在模板test和check所确定的范围内的行都被打印。# 打印从第五行开始到第一个包含以test开始的行之间的所有行。
sed -n '5,/^test/p' example# 对于模板test和check之间的行,每行的末尾用字符串sed test替换。
sed '/test/,/check/s/$/sed test/' example
2.5. 多点编辑(e 命令)
# (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
sed -e '1,5d' -e 's/test/check/' example
2.6. 插入(i 命令)
# 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
sed '/aa/i\\ new str
三、awk
AWK 是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
3.1. 三种调用方式
- 命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件;
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格;
- shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
- 将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
3.2. 实例
# 显示最近登录的5个帐号
last -n 5 | awk '{print $1}'
# 读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。# 显示/etc/passwd的账户
cat /etc/passwd | awk -F ':' '{print $1}' # awk+action的示例,每行都会执行action{print $1}, -F指定域分隔符为':'# 显示/etc/passwd的账户和账户对应的shell,且账户与shell之间以tab键分割
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'# 显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
# 先执行BEGIN,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。# 搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd # pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。# 找root开头的(正则)
awk -F: '/^root/' /etc/passwd# 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F: '/root/{print $7}' /etc/passwd
3.3. 内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
# 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd# 使用printf替代print
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd# print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
# printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
3.4. awk 编程
# 统计/etc/passwd的账户人数(count 是自定义变量)
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd# 统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'# 以M为单位显示
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'# 条件语句
# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'# 循环语句
# 显示/etc/passwd的账户
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
3.5. 参考
官方参考
四、自动化部署脚本
4.1. 安装 jdk
BASE_SERVER=node04
yum install -y wget
wget $BASE_SERVER/soft/jdk-7u45-linux-x64.tar.gz
tar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk1.7.0_45
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
4.2. ssh 免密
#!/bin/bashSERVERS="node03 node04"
PASSWORD=999999
BASE_SERVER=192.168.100.10auto_ssh_copy_id() {expect -c "set timeout -1;spawn ssh-copy-id $1;expect {*(yes/no)* {send -- yes\r;exp_continue;}*assword:* {send -- $2\r;exp_continue;}eof {exit 0;}}";
}ssh_copy_id_to_all() {for SERVER in $SERVERSdoauto_ssh_copy_id $SERVER $PASSWORDdone
}ssh_copy_id_to_allfor SERVER in $SERVERS
doscp install.sh root@$SERVER:/rootssh root@$SERVER /root/install.sh
done
相关文章:
shell 编程
文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除(d 命令…...

Leetcode.1401 圆和矩形是否有重叠
题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating : 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1)是矩形左下角的坐标,而 (x2, y2)是右上角的坐标。 如果圆和矩…...

CHAPTER 3 Web Server - httpd配置(二)
Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例:1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…...

VSCode 连接 SSH 服务器
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129133964 配置VSCode 下载VSCode:https://code.visualstudio.com/ 安装 Remote - SSH: 点击右下角蓝色图标: 连接服务器: 即可。 默认连接:ssh chen…...

如何选择靠谱的插画培训课程
如何选择靠谱的插画培训课程,今天教你3个维度选择一个靠谱的插画培训班! 插画培训机构课程: 1.选择插画培训班时,要先考察课程,看看课程内容是否符合自己的需求,是否有助于提高插画技术。课程设置应该灵活…...

剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树 难度:easy\color{Green}{easy}easy 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下…...

深入Spring底层透析后置处理器之豁然开朗篇
目录前言Spring的后置处理器Bean工厂后置处理器Bean后置处理器自定义Component实现注解开发前言 看这篇文章之前,需要了解Bean创建的过程,本篇文章是接着bean创建的基本流程的续写 Bean创建的基本过程:http://t.csdn.cn/1lK2d Spring的后置处…...

软件测试(基础定义篇)
测试基础 1、什么是软件测试?2、常见的测试分类3、质量模型 4、软件测试流程 5、测试用例 6、测试用例设计方法 )1、什么是软件测试? 1、什么是软件? 答:软件是控制计算机硬件工作的工具。 2、软件的组成? 3、什么是…...
华为OD机试 - 寻找目标字符串 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

使用echart绘制中国地图并显示人数
文章目录引言效果如图所示vue中echarts4.9版本,地图的使用引言 在做毕设的过程中,有一个需求:根据用户的ip,在前端展示出中国地图,然后展现出每个省有多少人这样子 经过百度后,发现可以使用echart来完成该…...

Git的常用命令
1:软件安装1.1:Git下载与安装百度上搜索Git官网:https://git-scm.com/下载:https://git-scm.com/download/win下载Git安装程序,双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…...
AcWing1018.最低通行费
1018.最低通行费一个商人穿过一个 NN 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 (2N−1)(2−1) 个单位时间穿越出去。而在经过中间的每个小方…...

【面试题】vue中的插槽是什么?
大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库一、slot是什么在HTML中 slot 元素 ,作为 Web Components 技术套件的一部分,是Web组件内的一个占位符该占位符可以在后期…...
Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?
本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 定义 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性。 定义方式: type 类型名 struct {字段名 字段类…...
华为OD机试 - 航天器(Python) | 机试题+算法思路+考点+代码解析 【2023】
航天器 题目 给航天器一侧加装长方形和正方形的太阳能板(图中的斜线区域); 需要先安装两个支柱(图中的黑色竖条); 再在支柱的中间部分固定太阳能板; 但航天器不同位置的支柱长度不同; 太阳能板的安装面积受限于最短一侧的那支支柱的长度; 现提供一组整型数组的支柱高度数据;…...

【Optional】告别丑陋判空,使用Optional类
一、概述 当项目中充斥着大量的、丑陋的判空语句,如下: if (user ! null) {Address address user.getAddress();if (address ! null) {Country country address.getCountry();if (country ! null) {String isocode country.getIsocode();if (isocod…...

魔兽世界服务端端新手搭建教程
明杰也是很久以前开始研究魔兽服务器架设,主要原因是亚服经常要排队6-7个小时,去不排除的服和单机没啥区别,以怀旧服玩到10级以后就开始玩335端,一开始也和新入手的人一样云里雾里的,经过长时间的学习总算有点成就,向新…...

宝塔搭建实战人才求职管理系统mobile手机端vue源码(五)
大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享骑士cms会员管理member前端vue在本地运行打包、宝塔发布部署的方式,本期给大家分享,mobile移动端vue怎么在本地运行,打包,实现线上功能更新替换的方…...
生态应用:探讨 NGINX 与上下游系统集成时的开发经验
NGINX 作为一款高性能的 Web 服务器和反向代理服务器,在各种应用场景中广泛应用。随着业务的发展,我们在使用 NGINX 时,可能需要将其与其他系统进行集成,以实现更加复杂的业务需求。 本文将结合实际应用场景,探讨 NGI…...

ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
本文介绍在ArcGIS下属的ArcMap软件中,基于Mosaic工具,批量对大量栅格遥感影像文件加以拼接、镶嵌的方法。 在GIS应用中,我们时常需要对大量栅格遥感影像数据加以批量拼接的工作。这一步骤可以基于Python语言实现,具体可以参考文章…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...