Shell脚本编程

文章目录

  • 一、简介
  • 二、变量
    • 变量命名
    • 使用变量
    • 只读变量
    • 删除变量
    • 变量种类
  • 三、数组
  • 四、算数运算
  • 五、条件测试
    • 数值测试
    • 字符串测试
    • 文件测试
    • 组合测试
  • 六、选择执行
  • 七、用户交互
    • read命令
  • 八、循环语句
    • for循环
    • while循环
    • until循环
  • 九、函数
  • 十、调试脚本
  • 十一、环境配置
    • bash配置文件
    • 案例,开机显示系统信息脚本
    • 案例,监控httpd进程
    • 案例,统计两个目录

一、简介

  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。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)
    • Shell for Root(/sbin/sh)
  • 程序编程风格

    • 过程式:以指令为中心,数据服务于命令
    • 对象式:以数据为中心,命令服务于数据
    • shell是一种过程式编程
  • 过程式编程

    • 顺序执行
    • 循环执行
    • 选择执行
  • 编程语言分类

    • 编译型语言
    • 解释型语言(shell是一种解释型语言)
      在这里插入图片描述
  • 运行脚本

    • 给予执行权限,通过具体的文件路径指定文件执行
    • 直接运行解释器,将脚本作为解释器程序的参数运行

二、变量

变量命名

  • 命名只能使用英文字母,数字和下划线,首字母不能以数字开头
  • 中间不能够有特殊字符,可以使用_下划线
  • 不能使用标点符号
  • 不能使用bash中的关键字
有效命名:
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效命名:
?var=123
user*name=runoob
语句给变量赋值
for file in `ls /etc`for file in $(ls /etc)

使用变量

定义变量:
your_name="eagles"
使用变量:
echo $your_name
echo ${your_name}
建议使用{}号作边界
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
如果使用$skillScript,则将会输出空值

只读变量

#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
执行脚本后,显示只读变量无法修改

删除变量

#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl

变量种类

  • 本地变量:生效范围仅为当前shell进程;(其他shell,当前的子sehll进程均无效)
    • 变量赋值:name = “value”
  • 环境变量:生效范围为当前shell进程及子进程
    • 变量声明1:export name = “value”
    • 变量声明2:declare -x name = “value”
    • bash中有许多内建的变量环境:SHELL,PATH等等
  • 局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
  • 位置变量: 2…来表示,让脚本在脚本代码中调用通过命令行传递给它的参数;
  • 特殊变量:? 0 * @ #
$1,$2,…:对应调用第1,第2等参数
$0:命令本身
$*:传递给脚本的所有参数(把所有参数当作整体)
$@:传递给脚本的所有参数
$#:传递给脚本的参数的个数
案例1:
myecho.sh
#!/bin/bash
echo "命令本身是:$0"
echo "第一个参数是:$1"
echo "第二个参数是:$2"
echo "一共有$#个参数"
echo "所有参数是:$@"

案例2:判断所给文件的行数
linecount.sh
#!/bin/bash
linecount="$(wc -l $1|cut -d' ' -f1)"
或者linecount="$(wc -l $1|awk '{print $1}')"
echo "This file have ${linecount} lines"

三、数组

  • 语法格式
语法格式:array_name=(value1 ... valuen)
示例:
my_array=(A B C D)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
  • 读取数组
读取数组:${array_name[index]}
获取数组中的所有元素:
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
  • 获取数组的长度
获取数组的长度:
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

四、算数运算

  • 运算符
+ ‐ * / % ** ...
增强赋值:
+=,‐=,*=,/=,%=
乘法符号有些场景中需要转义 : *\
bash有内建随机数生成器:$RANDOM
  • 完成算数运算
(1) let var(变量名)=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 …) var=$(expr 1 + 2)
expr本身是一个命令,可以直接进行运算
[root@centos73 ~]# expr 1+2
1+2
[root@centos73 ~]# expr 1 + 2注意要空格才可以进行运算。乘法符号有些场景中需要转义,如 *。也就是expr这个命令后面跟的是3个参数
3
  • 练习题
练习1:计算/etc/passwd文件中第10个用户的第20个用户的ID之和
#!/bin/bash
userid1=$(sed -n '10p' | awk -F":" '{print $3}') /etc/passwd

# userid1=`awk -F":" '{if (NR==10) print $3}' /etc/passwd`
userid2=$(sed -n '15p' | awk -F":" '{print $3}') /etc/passwd
userid_sum= $[$userid1 + $userid2]
echo '总和为$userid_sum'
练习2:传递两个文件路径参数给脚本,计算这两个文件之中所有空白行之和
#!/bin/bash
line1=`cat $1 |grep -c "^$"`
line2=`cat $2 |grep -c "^$"`
sum=$[$line1+$line2]
echo "总空行为$sum"
练习3:统计/etc/,/var/,/usr/目录下有多少目录和文件
#!/bin/bash
sum_etc=$(find /etc/ |wc -l)
sum_var=$(find /var/ |wc -l)
sum_usr=$(find /usr/ |wc -l)
sum_all=$[$sum_etc+$sum_var+$sum_usr]
echo $sum_all

五、条件测试

测试命令:test EXPERSSION

num1=100
num2=100
if test $[num1] -eq $[num2]
then
	echo '两个数相等!'
else
	echo '两个数不相等!'
fi

数值测试

‐gt:是否大于

‐ge:是否大于等于

‐eq:是否等于

‐ne:是否不等于

‐lt:是否小于

‐le:是否小于等于

练习题,比较两个数的大小

[root@localhost ~]# cat diff.sh
#!/bin/bash
read -p "请输入两个整数" num1 num2
if [ $num1 -gt $num2 ];then
	echo "$num1 > $num2"
elif [ $num1 -lt $num2 ];then
	echo "$num1 < $num2"
else
	echo "$num1 = $num2"
fi

字符串测试

==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的PATTERN所匹配
Note:此表达式一般用于[[ ]]中
‐z “STRING”:测试字符串是否为空,空则为真,不空则为假
‐n “STRING”:测试字符串是否不空,不空则为真,空则为假

文件测试

简单的存在性测试:
‐a FILE :文件存在性测试,存在为真,否则为假
存在性及类型测试:
‐b FLIE:是否存在且为块设备文件;
‐c FILE:是否存在且为字符设备文件;
‐d FILE:是否存在且为目录文件;
‐f FILE:是否存在且为普通文件;
‐h FILE 或 ‐L FILE : 存在且为符号链接文件;
‐p FIEL :是否存在且为命名管道文件;
‐S FILE:是否存在且为套接文件;
文件权限测试:
‐r FILE:是否存在且可读
‐w FILE:是否存在且可写
‐x FILE:是否存在可执行
文件特殊权限测试:
‐u FILE:是否存在且拥有suid权限;
‐g FILE:是否存在且拥有sgid权限;
‐k FILE:是否存在且拥有sticky权限;
文件大小测试:
‐s FILE:是否存在且非空
文件是否打开:
‐fd:fd表示文件描述符是否已经打开且与某终端相关
‐N FILE:文件自动上一次读取之后是否被修改过;
‐O FILE:当前用户是否为文件的属主;
‐G FILE:当前有效用户是否为文件数组;
双目测试:
FILE1 ‐ef FILE2 :FILE1与FILE2是否指向同一个设备上的相同inode
FILE1 ‐nt FILE2:FILE1是否新于FILE2
FILE1 ‐ot FILE2:FILE1是否旧于FILE2

组合测试

逻辑运算符:
&&代表的意思是当前一个命令执行成功时会继续执行后续的命令,当前一个命令执行失败的时候不会执行后续的命令
||代表的意思是当前一个命令执行成功时不会继续执行后续的命令,当前一个命令执行失败的时候会执行后续的命令
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
第二种方式:
EXPRESSION1 ‐a EXPRESSION2
EXPRESSION1 ‐o EXPRESSION2
! EXPRESSION
Note:必须使用测试命令进行

六、选择执行

  • 单分支选择结构
if 判断条件;then
条件为真的分支代码
fi
  • 双分支选择结构
if 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
  • 多分支选择结构
if 判断条件;then
条件为真的分支代码
elif 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
  • 练习题
练习1:判断两个数是否相等

Note:if经常会与test命令一起使用
练习2:判断用户是否存在,如果不存在添加用户,并设置密码和用户相同
#!/bin/bash
#read -p "请输入用户" $1
if [ $# -eq 1 ]
then
echo "arg less than 1"
exit 1	# 可以用echo?查看退出码,方便检查
fi
id $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "用户已存在"
exit 2
else
useradd $1 && echo "$1" | passwd --stdin $1 &> /dev/null
fi

七、用户交互

read命令

  • 常用选项:

    • ‐a:将内容读入到数组中
      • echo ‐n “Input muliple values into an array:”
      • read ‐a array
      • echo “get ${#array[@]} values in array”
    • ‐d : 表示delimiter,即定界符,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除
    • ‐e :只用于互相交互的脚本
    • ‐n : 用于限定最多可以有多少字符可以作为有效读入
    • ‐p :用于给出提示符,例如:echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示
    • ‐r :特殊字符生效(/n等),也应采用‐r选项。
    • ‐s : 对于一些特殊的符号不打印的情况
    • ‐t :用于表示等待输入的时间(s),等待时间超过,将继续执行后面的脚本
  • 练习1:提示为:“input your name:”,输入姓名后,进行输出

#!/bin/bash
read ‐p "input your name:" name
read -p "input your name:" pd
res=`mysql -e "select count(*) from test.t_login where username=${name} and password=${pd}"| sed -n "2p"` 2> /dev/null
#echo "${res}"
mysql_status=`mysqladmin ping &> /dev/null`
if [ $? -ne 0 ];then
echo"mysql error"
exit 100
fi
if [ $res -eq 0 ]
then
echo "登陆失败"
exit 1 
else
echo ${name}
echo "登录成功"
exit 0
fi
  • 练习2:读取test.txt文本,输出格式为: linecount:context
test.txt
aaa
bbb
ccc
#!/bin/bash
nl test.txt | awk '{print $1":"$2}'

#!/bin/bash
count=1
cat test.txt| while read line 
do
echo "$count:$line"
count=$[ $count+1 ]
donecat
echo "Finish"

八、循环语句

for循环

  • 循环体:需要执行的语句,可能执行n遍
  • 语法
for 变量名 in 列表;do
循环体
done
  • 执行机制:依次将列表中的元素赋值给“变量名”;每次赋值后执行一次循环体;直到列表中的元素耗尽,循环结束
  • 练习题1:创建用户user1‐user10家目录,并且在user1‐10家目录下创建1.txt‐10.txt
#!/bin/bash
for i in {1..10};do
mkdir /home/user$i
for i in (seq 1 10);do
touch /home/user$i/user$i.txt
done
done
练习题2:列出/var/目录下各个子目录占用磁盘大小
#!/bin/bash
for i in `ls /var/`
do
path="/var/$i"
if [ -d $path ]
then 
du -sh $path
fi
done

  • 练习题2:批量测试地址是否在线
[root@localhost ~]# cat ping.sh
#!/bin/bash
for i in {1..255}
do
ping -c2 -W1 192.168.175.$i &> /dev/null
[ $? -eq 0 ] && echo 192.168.175.$i >> ./host.txt
done

while循环

  • 语法
while 测试条件;do
循环体
done
  • 经典使用,遍历一个文件
#!/bin/bash
while read a;do
echo $a
done < /datas/6files
  • 练习题1:计算1+2+…10
#!/bin/bash
i=1
while ((i<=10))
do
let sum+=i
let ++i
done
echo $sum
  • 练习题2,猜随机数游戏
[root@localhost ~]# cat ran.sh
#!/bin/bash
ran=`echo $((RANDOM%100+1))`
i=0
while true
do
	read -p "请输入你要猜的数字" num
	let i++
	if [ $num -gt $ran ];then
		echo "你猜测的数字大了"
	if [ $num -lt $ran ];then
		echo "你猜的数字小了"
	else
		echo "恭喜你,猜对了!"
		echo "你一共猜了$i次"
		exit
	fi
done

until循环

  • while的是条件是测真值,until的条件式测假值
  • 语法
until 条件测试;do
循环体
done
  • 练习1:99乘法表
#!/bin/bash
a=1
b=1
until ((a > 9));do
until ((b > a));do
let "c=a*b" #声明变量c
echo -n "$a*$b=$c"	# -n的意思是不换行
let b++
done
let a++
let b=1	#因为每个乘法表都是1开始乘,所以b要重置
echo "" #显示到屏幕换行
done

九、函数

  • 语法
function FUNNAME(){
函数体
返回值
}
FUNNME #调用函数
  • 实例1
#!/bin/bash
demoFun(){
echo '这是我的第一个 shell 函数!'
}
echo "‐‐‐‐‐函数开始执行‐‐‐‐‐"
demoFun
echo "‐‐‐‐‐函数执行完毕‐‐‐‐‐"
  • 带返回值并且调用返回值
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum$anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
#可以使用$?来获取返回值
  • 函数参数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数

十、调试脚本

  • -x : 在执行时显示参数和命令;
  • +x:禁止调试
  • -v:当命令行进行读取时显示输入;
  • +v:禁止打印输入。
    • n:检测脚本中的语法错误
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十一、环境配置

bash配置文件

  • 生效范围分类

    • 全局配置:
      • /etc/bashrc
      • /etc/profile
      • /etc/profile.d/*.sh
    • 个人配置
      • ~/.bash_profile
      • ~/.bashrc
  • 功能分类

    • profile类:为交互式的shell提供配置
    • bashrc类:为非交换式的shell提供配置
  • shell登录

    • 交互式登录:su - USERNAME
    • /etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
    • 非交换式登录:su USERNAME
  • 编辑配置文件定义的新设置的生效方式

    • 重新启动shell进程
    • 使用source命令

案例,开机显示系统信息脚本

[root@localhost ~]# cat os.sh
#!/bin/bash
yum install -y net-tools &> /dev/null
wangka=`ip a | grep ens | head -1 | cut -d: -f2`
System=$(hostnamectl | grep System | awk '{print $3,$4,$5}')
Kernel=$(hostnamectl | grep Kernel | awk -F: '{print $2}')
Virtualization=$(hostnamectl | grep Virtualization| awk '{print $2}')
Statichostname=$(hostnamectl | grep Static|awk -F: '{print $2}')
Ens32=$(ifconfig $wangka | awk 'NR==2 {print $2}')
Lo=$(ifconfig lo0 | awk 'NR==2 {print $2}')
NetworkIp=$(curl -s icanhazip.com)
echo "当前系统版本是:$System"
echo "当前系统内核是:$Kernel"
echo "当前虚拟平台是:$Virtualization"
echo "当前主机名是:$Statichostname"
echo "当前网卡$wangka的地址是:$Ens32"
echo "当前lo0接口的地址是:$Lo"
echo "当前公网地址是:$NetworkIp"
[root@localhost ~]# bash os.sh
当前系统版本是:CentOS Linux 7
当前系统内核是: Linux 3.10.0-693.el7.x86_64
当前虚拟平台是:vmware
当前主机名是: localhost.localdomain
当前网卡 ens33的地址是:192.168.80.129
当前lo0接口的地址是:127.0.0.1
当前公网地址是:112.4.252.23

案例,监控httpd进程

##################################################################

#############################################################

#需求:

#1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务,并检测服务是否重启成功

#2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件(使用echo输出已发送即可),并退出检测

#3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送告警邮件,并退出检测

##################################################################

##############################################################

#!/bin/bash
function check_httpd_process_number() {
process_num=`ps -ef | grep httpd| wc -l`

if [ $process_num -gt 50 ];then
	systemctl restart httpd &> /dev/null
	# 重启五次httpd确保服务启动
	systemctl status httpd &> /dev/null
	if [ $? -ne 0 ];then
		num_restart_httpd=0
		while true;do
			let num_restart_httpd++
			systemctl restart httpd &> /dev/null
			systemctl status httpd &> /dev/null
			[ $? -eq 0 ] && break
			[ $num_restart_httpd -eq 6 ] && break
		done
	fi
	
	# 判断重启服务的结果
	systemctl status httpd &> /dev/null
	[ $? -ne 0 ] && echo "apache未正常重启,已发送邮件给管理员" && return 1
	sleep 60
	return 0
	
	# 再次判断进程是否正常
	process_num=`ps -ef | grep httpd| wc -l`
	if [ $process_num -gt 50 ] ;then
		echo "apache经过重启进程数依然大于50"
		return 1
	else
		return 0
	fi
	
else
	echo "进程数小于50"
	sleep 10
	return 0
fi
}

# 每十秒钟执行一次函数,检查进程是否正常
while true;do
check_httpd_process_number
[ $? -eq 1 ] && exit
done
	
# while true;do ab -c 10000 -n 20000 http://127.0.01/;done

案例,统计两个目录

#!/bin/bash
# server1的文件在/test/目录中,server2的文件在/root/demo中,通过md5值来判断文件一致性,最终输出相同文件以及各自的不同文件
#定义两个数组的索引
point1=0
point2=0
# 将server1上的文件的散列值记录到数组当中
for i in `ls /root/demo`;do
	md5=`md5sum /root/demo/$i |awk '{print $1}'`
	arrar1[$point1]=$md5:$i
	echo ${arrar1[$point1]}
	let point1++
done
echo "/root/demo的文件"
# 将server2上的文件的散列值记录到数组当中
for i in `ls /test`;do
	md5=`md5sum /test/$i |awk '{print $1}'`
	arrar2[$point1]=$md5:$i
	echo ${arrar2[$point2]}
	let point2++
done

# 找出相同文件以及server1上的独立文件,server1的每个文件都和server2上进行比较
echo "------------------------"
for i in ${arrar1[@]};do
	for j in ${arrar2[@]};do
		temp_flag=0	#定义一个标志位,表示没有找到相同的文件
		server1_md5=`echo $i| awk -F: '{print $1}'`
		server2_md5=`echo $j| awk -F: '{print $1}'`
		server1_filename=`echo $i| awk -F: '{print $2}'`
		server2_filename=`echo $j| awk -F: '{print $2}'`
		if [ $server1_md5 == $server2_md5 ];then
        	echo -e "两边共同文件\t\t\t$server1_filename"
        	temp_flag=1
        	break	# 找到了相同的文件
        fi
    done
    if [ $temp_flag -eq 0 ];then
    	echo -e "server1不同的文件\t\t\t$i"
    fi
done

# 找出server2上的独立文件
for i in ${arrar2[@]};do
	for j in ${arrar1[@]};do
		temp_flag=0
		server1_md5=`echo $j| awk -F: '{print $1}'`
		server2_md5=`echo $i| awk -F: '{print $1}'`
		server1_filename=`echo $j| awk -F: '{print $2}'`
		server2_filename=`echo $i| awk -F: '{print $2}'`
		if [ $server1_md5 == $server2_md5 ];then
        	temp_flag=1
        	break	# 找到了相同的文件
        fi
    done
    if [ $temp_flag -eq 0 ];then
    	echo -e "server2不同的文件\t\t\t$i"
    fi
done

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器解析漏洞及任意文件下载

1.服务器文件解析漏洞 文件解析漏洞,是指Web容器&#xff08;Apache、nginx、iis等&#xff09;在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果。从而,黑客可以利用该漏洞实现非法文件的解析。 &#xff08;1) Apache linux系统中的apache的php配置文件在/etc/apac…

备战蓝桥杯---动态规划(基础1)

先看几道比较简单的题&#xff1a; 直接f[i][j]f[i-1][j]f[i][j-1]即可&#xff08;注意有马的地方赋值为0&#xff09; 下面是递推循环方式实现的AC代码&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long int a[30][30]; int n,m,x,y; …

Hive窗口函数详解

一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…

【Linux】make和Makefile

目录 make和Makefile make和Makefile 我们使用vim编辑器的时候&#xff0c;在一个文件里写完代码要进行编译&#xff0c;要自己输入编译的指令。有没有一种可以进行自动化编译的方法——makefile文件&#xff0c;它可以指定具体的编译操作&#xff0c;写好makefile文件&#x…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D &#xff0c; 任务 &#xff1a;宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel&#xff0c; 命名为PlayerInfo 新建Image&#xff0c;作为头像 新建Slider&#xff0c;作为血条 对Panel组件添加一个水…

案例:CentOS8 在 MySQL8.0 实现半同步复制

异步复制 MySQL 默认的复制即是异步的&#xff0c;主库在执行完客户端提交的事务后会立即将结果返给给客户端&#xff0c;并不关心从库是否已经接收并处理&#xff0c;这样就会有一个问题&#xff0c;主节点如果 crash 掉了&#xff0c;此时主节点上已经提交的事务可能并没有传…

滑动窗口的最大值

题目 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 思路 使用一个队列充当不断滑动的窗口&#xff0c;每次滑动记录其中的最大值&#xff1a; 如何在 O(1) 时间计算最大值&#xff0c;只需要一个特殊的数据结构「单调队列」&#xff0c;push 方法依然在队尾添…

Swift 隐藏宝藏:“逆天改命”调整方法重载(function overloading)优先级

概览 在 Swift 语言中有很多隐藏“宝藏”悄悄深埋在不为人知的角落&#xff0c;静静等待着有缘秃头码农们的大力挖掘。 而在这里&#xff0c;我们将介绍 Swift 语言中一个非常有用的秘技&#xff1a;方法重载优先级判断以及如何改变它。 在本篇博文中&#xff0c;您将学到如下…

腾讯云4核8G服务器性能如何?支持多少用户访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

移动光猫gs3101超级密码及改桥接模式教程

文章目录 超级管理员账号改桥接模式路由器连接光猫&#xff0c;PPPOE拨号即可&#xff01;附录&#xff1a;如果需要改桥接的话不知道拨号密码咋办打开光猫Telnet功能Telnet 登录 参考文章 移动光猫吉比特GS3101超级账号获取更改桥接 移动光猫gs3101超级密码及改桥接模式教程 …

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

QXlsx Qt操作excel(3)

QXlsx 是一个用于处理Excel文件的开源C库。它允许你在你的C应用程序中读取和写入Microsoft Excel文件&#xff08;.xlsx格式&#xff09;。该库支持多种操作&#xff0c;包括创建新的工作簿、读取和写入单元格数据、格式化单元格、以及其他与Excel文件相关的功能。 关于QXlsx的…

【机器学习】数据清洗之识别异常点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

猫头虎分享已解决Bug | Go Error: cannot use str (type string) as type int in assignment

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

webgis后端安卓系统部署攻略

目录 前言 一、将后端项目编译ARM64 二、安卓手机安装termux 1.更换为国内源 2.安装ssh远程访问 3.安装文件远程访问 三、安装postgis数据库 1.安装数据库 2.数据库配置 3.数据导入 四、后端项目部署 五、自启动设置 总结 前言 因为之前一直做的H5APP开发&#xf…

HiveSQL——用户行为路径分析

注&#xff1a;参考文档&#xff1a; SQL之用户行为路径分析--HQL面试题46【拼多多面试题】_路径分析 sql-CSDN博客文章浏览阅读2k次&#xff0c;点赞6次&#xff0c;收藏19次。目录0 问题描述1 数据分析2 小结0 问题描述已知用户行为表 tracking_log&#xff0c; 大概字段有&…

Java多态原理

参考 虚方法 JVM杂记&#xff1a;对多态实现原理、虚方法表、虚方法、静态解析、动态链接的一些思考_多态和方法表的关系-CSDN博客 静态分派与动态分派 &#xff08;JVM&#xff09;Java虚拟机&#xff1a;静态分派 & 动态分派 原理解析 - 掘金 虚方法表 JVM 栈帧&am…

假期day5

TCP UDP区别 共同点&#xff1a;都是属于传输层的协议 TCP&#xff1a;稳定。面向连接的&#xff0c;有可靠的数据传输服务。传输过程中数据无误&#xff0c;无丢失&#xff0c;无失序&#xff0c;无重复。传输效率低&#xff0c;耗费资源多。数据收发不同步&#xff0c;有沾…

C++基础入门之引用

目录 一.引用 1.1引用和取地址 1.2 别名和原名的区别 1.3 引用的用法 1.31 做参数 1.311 输出型参数&#xff1a;形参改变实参 1.312 可以减少拷贝&#xff0c;增加效率 1.32 引用的约定 1. 引用必须初始化 2. 引用定义后&#xff0c;不能改变指向 4. 给指针取别名 1.33…

『运维备忘录』之 HTTP 响应状态码速查

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…