Linux处理用户输入
目录
一、传递参数
1.1 读取参数
1.2 读取脚本名
二、跟踪参数
三、移动参数
四、处理选项
4.1 查找选项
4.1.1 处理简单选项
4.1.2 分离参数和选项
4.1.3 处理含值的选项
五、选项标准化
5.1 使用 getopt 命令
5.1.1 命令格式
5.1.2 在脚本中使用getopt
5.2 使用getopts命令
六、获取用户输入
6.1 read读取
6.2 从文件中读取
一、传递参数
向 shell 脚本传递数据的最基本方法是使用命令行参数。bash shell 会将所有的命令行参数都指派给称作位置参数的特殊变量。这也包括shell脚本名称。位置变量的名称都是标准数字,$0 对应脚本名,$1 对应第一个命令行参数,$2 对应第二个命令行参数,以此类推,直到 $9,第9个之后,必须在变量名两侧加上花括号,比如 ${10} 。
1.1 读取参数
如果需要 输入更多的命令行参数,则参数之间必须用空格分开
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat position.sh
#! /bin/bashvalue=$[ ${10} * ${11} ]
echo "第10个参数是${10}"
echo "第11个参数是${11}"
echo $value
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
1.2 读取脚本名
可以使用位置变量 $0 获取在命令行中运行的脚本名。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat position.sh
#! /bin/bashvalue=$[ ${10} * ${11} ]
echo "第10个参数是${10}"
echo "第11个参数是${11}"
echo $value
echo "脚本名是$0"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
脚本名是position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
但是这会有一个问题,如果使用另一个命令运行shell脚本,则命令名会和脚本名混在一起
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat position.sh
#! /bin/bashvalue=$[ ${10} * ${11} ]
echo "第10个参数是${10}"
echo "第11个参数是${11}"
echo $value
echo "脚本名是$0"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
脚本名是position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
脚本名是./position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
这还不是唯一的问题,如果运行脚本时使用的是绝对路径,那么位置变量 $0 就会包含整个路径
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# pwd
/root
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ~/position.sh
/root/position.sh: line 3: * : syntax error: operand expected (error token is "* ")
第10个参数是
第11个参数是脚本名是/root/position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
basename 命令可以返回不包含路径的脚本名
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat position.sh
#! /bin/bashvalue=$[ ${10} * ${11} ]
echo "第10个参数是${10}"
echo "第11个参数是${11}"
echo $value
name=$(basename $0)
echo "脚本名是$name"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
脚本名是position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
利用此技术可以编写一个脚本,生成能标识脚本运行时间的日志信息
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat position.sh
#! /bin/bashvalue=$[ ${10} * ${11} ]
echo "第10个参数是${10}"
echo "第11个参数是${11}"
echo $value
name=$(basename $0)
echo "脚本名是$name"
echo "The $name ran at $(date)" >> ~/scripttrack.log
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# date
Fri May 10 15:42:54 CST 2024
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./position.sh 1 2 3 4 5 6 7 8 9 10 12
第10个参数是10
第11个参数是12
120
脚本名是position.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll
total 12
-rwxr--r-- 1 root root 210 May 10 15:42 position.sh
drwxr-xr-x 2 root root 4096 May 9 23:36 script
-rw-r--r-- 1 root root 52 May 10 15:43 scripttrack.log
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat scripttrack.log
The position.sh ran at Fri May 10 15:43:01 CST 2024
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
二、跟踪参数
特殊变量 $# 含有脚本运行时携带的命令行参数的个数,${!#} 代表最后一个位置变量,$* 和 $@ 各自包含了所有的命令行参数。$* 将所有参数视为一个整体,$@ 会将所有命令行参数视为同一字符串中的多个独立的单词,可以用 for 遍历所有参数。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat params.sh
#! /bin/bash
echo
echo "\$*用法:$*"
count=1
for param in "$*"
doecho "\$* #$count = $param"count=$[ $count + 1 ]
done########
echo
echo "\$@用法:$@"
count=1
for param in "$@"
doecho "\$@ #count = $param"count=$[ $count +1 ]
done
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash params.sh 1 2 3$*用法:1 2 3
$* #1 = 1 2 3$@用法:1 2 3
$@ #count = 1
$@ #count = 2
$@ #count = 3
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
三、移动参数
shift 命令会根据命令行参数的相应位置进行移动,默认情况下会将每个位置的变量值都向左移动一个位置。因此,变量 $3 的值会移入 $2 ,变量 $2 的值会移入 $1 ,而变量 $1 的值会被删除(变量 $0 是脚本名,不会变)。这是遍历命令行参数的另一种好方法,尤其在不知道到底有多少参数的时候。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat shift.sh
#! /bin/bash
echo
echo "shift的用法"
count=1
while [ -n "$1" ]
doecho "#$count = $1"count=$[ $count + 1 ]shift
done
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash shift.sh ab cd 12 34 dfshift的用法
#1 = ab
#2 = cd
#3 = 12
#4 = 34
#5 = df
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
四、处理选项
4.1 查找选项
在命令行中,选项紧跟在脚本名之后,就跟其他命令行参数一样 。你可以像处理命令行参数一样处理命令行选项
4.1.1 处理简单选项
在提取单个参数时,使用 case 语句来判断某个参数是否为选项
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# vim option.sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat option.sh
#! /bin/bash
echo
while [ -n "$1" ]
docase "$1" in-a) echo "a是一个选项";;-b) echo "b是一个选项";;-c) echo "c是一个选项";;*) echo "$1不是一个选项";;esacshift
done
echo
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -b -a e -fb是一个选项
a是一个选项
e不是一个选项
-f不是一个选项[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
4.1.2 分离参数和选项
经常会碰到同时使用选项和参数的情况。在Linux系统中,处理这个问题的标准做法是使用特殊字符将两者分隔,该字符告诉脚本选项何时结束,普通字符何时开始。在Linux系统中这个特殊字符是双连字符(--)。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat option.sh
#! /bin/bash
echo
while [ -n "$1" ]
docase "$1" in-a) echo "-a是一个选项";;-b) echo "-b是一个选项";;-c) echo "-c是一个选项";;--) shiftbreak;;*) echo "$1不是一个选项";;esacshift
done
#
echo
count=1
for param in "$@"
doecho "参数#$count = $param"count=$[ $count + 1 ]
done
echo
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -b -a -d -- 1 21 6-b是一个选项
-a是一个选项
-d不是一个选项参数#1 = 1
参数#2 = 21
参数#3 = 6[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
在遇到双连字符时,脚本会用break命令跳出while循环。由于提前结束了循环,因此需要再加入另一个shift命令将双连字符移除位置变量
4.1.3 处理含值的选项
有些选项需要一个额外的参数值,像下面这样
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat option.sh
#! /bin/bash
echo
while [ -n "$1" ]
docase "$1" in-a) echo "-a是一个选项";;-b) echo "-b是一个选项"echo "参数$2"shift ;;-c) echo "-c是一个选项";;--) shiftbreak;;*) echo "$1不是一个选项";;esacshift
done
#
echo
count=1
for param in "$@"
doecho "参数#$count = $param"count=$[ $count + 1 ]
done
echo
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -b test -a -d -- 1 21 6-b是一个选项
参数test
-a是一个选项
-d不是一个选项参数#1 = 1
参数#2 = 21
参数#3 = 6[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
在这个例子中,case语句定义了3个要处理的选项。-b选项还需要一个额外的参数。由于要处理的选项位于 $1 ,因此额外的参数值就应该位于 $2 ,因为选项占用了两个位置,所以还需要使用 shift 命令多移动一次。
五、选项标准化
现在shell脚本已经拥有处理命令行选项的基本能力了,但是当你想合并多个选项时,脚本就不管用了。
5.1 使用 getopt 命令
5.1.1 命令格式
getopt 命令可以接受一系列任意形式的命令行选项和参数,并自动将其转换为适当格式。getopt 格式如下:getopt optstring parameters
首先,在 optstring 中列出要在脚本中用到的每个命令行选项字母。然后,在每个需要参数值的选项字母后面加一个冒号。如下:
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# getopt ab:cd -a -b value -cd 1 2-a -b value -c -d -- 1 2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
如果 optstring 未包含制定的选项,则会输出一条错误信息,如果想忽略,可以使用 -q 选项。
5.1.2 在脚本中使用getopt
1)可以在脚本中使用 getopt 格式化脚本所携带的任何命令行选项或参数。难点在于使用 getopt 格式化版本替换已有的命令行选项和参数。这得求助于 set 命令;
2)set 命令有个选项是双连字符(--),可以将位置变量的值替换为 set 命令所指定的值;
3)具体做法是将脚本的命令行参数传递给getopt命令,然后将getopt命令的输出传递给set命令,用getopt格式化后的命令行参数来替换原始的命令行参数,如下所示:
set -- $(getopt -q ab:cd "$@")
现在,位置变量原先的值会被getopt命令的输出替换掉,后者已经是格式化好的命令行参数。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat option.sh
#! /bin/bashset -- $(getopt -q ab:cd "$@")
echo
while [ -n "$1" ]
docase "$1" in-a) echo "-a是一个选项";;-b) echo "-b是一个选项"echo "参数$2"shift ;;-c) echo "-c是一个选项";;--) shiftbreak;;*) echo "$1不是一个选项";;esacshift
done
#
echo
count=1
for param in "$@"
doecho "参数#$count = $param"count=$[ $count + 1 ]
done
echo
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -ab bvalue 12 3-a是一个选项
-b是一个选项
参数bvalue参数#1 = 12
参数#2 = 3[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
5.2 使用getopts命令
getopt 命令存在一个问题,如下代码所示:就是不擅长处理带空格和引号的参数值。它会将空格当做参数值的分隔符,而不是根据双引号将二者当做一个参数。这是 getopts 就派上用场了。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -ab bvalue 12 3 -c-a是一个选项
-b是一个选项
参数bvalue
-c是一个选项参数#1 = 12
参数#2 = 3[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash option.sh -ab bvalue "12 3" -c-a是一个选项
-b是一个选项
参数bvalue
-c是一个选项参数#1 = 12
参数#2 = 3
getopts 命令格式如下:
getopts optstring variable
1) optstring 值与 getopt 命令中使用的类似。有效的选项字母会在 optstring 中列出,如果选项要求参数,就在其后面加一个冒号。不想显示错误消息的话,可以在 optstring 之前加一个冒号。getopts 会将当前参数保存在命令行中定义的varibales中。
2)getopts 会用到两个环境变量。如果选项需要加带参数值,那么 OPTARG 环境变量保存的就是这个值。OPTIND 环境变量保存着参数列表中 getopts 正在处理的参数位置。这样在处理完当前选项之后就能继续处理其他命令行参数了。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat getopts.sh
#! /bin/bash
echo
while getopts :ab:cd opt
docase "$opt" ina) echo "-a是选项";;b) echo "-b是一个选项"echo "-b选项的参数是$OPTARG";;c) echo "-c是一个选项";;*) echo "未知选项$opt";;esac
done
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash getopts.sh -ab2-a是选项
-b是一个选项
-b选项的参数是2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
1) 在解析命令行选项时,getopts 会移除起始的连字符,所以 case 语句中不用连字符;
2)可以在参数值中加空格;
3)可以将选项字母和参数值写在一起,两者之间不加空格;
4)在处理每个选项时,getopts 会将OPTIND 环境变量的值增1.处理完选项后,可以使用shift命令和OPTIND值来移动参数。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat getopts.sh
#! /bin/bash
echo
while getopts :ab:cd opt
docase "$opt" ina) echo "-a是选项";;b) echo "-b是一个选项"echo "-b选项的参数是$OPTARG";;c) echo "-c是一个选项";;*) echo "未知选项$opt";;esac
done
#
shift $[ $OPTIND -1 ]
echo
count=1
for param in "$@"
doecho "参数#$count = $param"count=$[ $count + 1 ]
done
exit
六、获取用户输入
尽管命令行选项和参数是从脚本用户处获取输入的一种重要方式,但有时候脚本还需要更多
的交互性。为此,bash shell 提供了 read 命令。
6.1 read读取
read -p "Please enter your age:" age
read -t 5 -p "Please enter your age:" age # 超时
read -s "Enter your password:" password # 无显示输出
6.2 从文件中读取
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat read.sh
#! /bin/bash
echo
count=1
cat ~/getopts.sh | while read line
doecho "#$count = $line"count=$[ $count + 1 ]
done
echo "处理完文本的所有行"
exit
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# bash read.sh#1 = #! /bin/bash
#2 = echo
#3 = while getopts :ab:cd opt
#4 = do
#5 = case "$opt" in
#6 = a) echo "-a是选项";;
#7 = b) echo "-b是一个选项"
#8 = echo "-b选项的参数是$OPTARG";;
#9 = c) echo "-c是一个选项";;
#10 = *) echo "未知选项$opt";;
#11 = esac
#12 = done
#13 = #
#14 = shift $[ $OPTIND -1 ]
#15 = echo
#16 = count=1
#17 = for param in "$@"
#18 = do
#19 = echo "参数#$count = $param"
#20 = count=$[ $count + 1 ]
#21 = done
#22 = exit
处理完文本的所有行
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
while 循环会持续通过read命令处理文件中的各行,直到read命令以非0退出状态码退出
相关文章:
Linux处理用户输入
目录 一、传递参数 1.1 读取参数 1.2 读取脚本名 二、跟踪参数 三、移动参数 四、处理选项 4.1 查找选项 4.1.1 处理简单选项 4.1.2 分离参数和选项 4.1.3 处理含值的选项 五、选项标准化 5.1 使用 getopt 命令 5.1.1 命令格式 5.1.2 在脚本中使用getopt 5.2 使用…...
【代码笔记】高并发场景下问题解决思路
高并发指的是在单位时间内,瞬时流量激增,系统需要同时处理大量并行的请求或操作。这种情况通常出现在面向大量用户或服务的分布式系统中,尤其是当用户请求高度集中时,比如促销活动、秒杀活动、注册抢课、热点事件、定时任务调度等…...

【Docker系列】Linux部署Docker Compose
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

基于SSM的文化遗产的保护与旅游开发系统(有报告)。Javaee项目。ssm项目。
演示视频: 基于SSM的文化遗产的保护与旅游开发系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…...

整合springboot-mybatis时,MySQL数据库无法连接问题
整合springboot-mybatis时,MySQL数据库无法连接问题 解决步骤 先手动停止MySQL服务,在cmd后的控制台输入services.msc 找到MySql停止服务 修改配置文件,跳过验证 修改MySQL安装目录下的my.ini配置文件,使登录时跳过权限检查&a…...
C语言循环队列
以下是一个使用 C 语言实现的简单循环队列示例: #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 5// 定义循环队列结构体 typedef struct {int items[MAX_SIZE];int front, rear; } Queue;// 初始化队列 void initQueue(Queue *q) {q->fr…...

Docker运行出现iptables: No chain/target/match by that name报错如何解决?
在尝试重启 Docker 容器时遇到的错误信息表明有关 iptables 的配置出了问题。这通常是因为 Docker 需要配置网络,而 iptables 规则没有正确设置或被意外删除。具体到你的错误信息中,报错 iptables: No chain/target/match by that name 表示 Docker 尝试…...
力扣 122. 买卖股票的最佳时机 II python AC
动态规划 class Solution:def maxProfit(self, prices):pre float(inf)ans 0for now in prices:if now > pre:ans now - prepre nowreturn ans定义一个变量保存上一步位置最小的数值,来模拟dp --遍历股票数值 --如果当前数值大于上一次,将股票卖…...
F5 BIG-IP Next Central Manager SQL注入漏洞(CVE-2024-26026、CVE-2024-21793)
0x01 产品简介 BIG-IP Next Central Manager是BIG-IP Next的原生默认用户界面,它可跨平台管理BIG-IP Next实例。BIG-IP Next是F5 Networks公司推出的一款下一代BIG-IP软件,提供了多云应用安全和应用交付服务。 0x02 漏洞概述 CVE-2024-26026:BIG-IP Next Central Manager…...
Python3 笔记:循环结构 for语句
for语句是Python语言中构造循环结构程序的语句之一。 Python中for语句是通过循环遍历某一序列对象(字符串、列表、元组或字典)来构建循环,循环结束的条件就是对象被遍历完。 for循环基本语法格式: for 循环变量 in 遍历对象: …...
信息化与数字化的区别在哪里?
信息化与数字化虽然密切相关,但它们在核心理念、实施范围、目标定位、以及对企业的影响上存在本质区别: 1.中心与目标不同: • 信息化通常以流程为中心,致力于提高工作效率,通过信息技术优化和自动化企业内部的流程。…...

记录MySQL数据库查询不等于xxx时的坑
目录 一、背景 二、需求 三、方法 四、示例 一、背景 在使用MySQL数据库查询数据时,需要查询字段name不等于xxx的记录,通过where name ! xxx查询出来的记录不符合预期,通过检查发现少了name字段为null的记录,后经查询得知在My…...

QT的创建,发现编译器有一个黄色三角形感叹号,提示说Cmake配置错误,该怎么办?
确保你安装了Cmake 2.如果你电脑之前已经装了Cmake,那么在qt安装中,即便你选择了Cmake版本,但依旧不会修改电脑的Cmake版本。这时候就会出现黄色箭头。在勾勾的地方会有一个黄色感叹符号(我已经解决了,所以没有显示&a…...

0506libMaven项目
0506libMaven项目包-CSDN博客 数据库字段 界面需求...

HTML飘落的花瓣
目录 写在前面 HTML简介 完整代码 代码分析 系列推荐 写在最后 写在前面 本期小编给大家推荐HTML实现的飘落的花瓣,无需安装软件,直接下载即可打开~ HTML简介 HTML(Hypertext Markup Languageÿ…...

一个小调整,竟然让交换机、路由器的CPU占用率降低了50%
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 在信息时代下,不仅仅在网络工程领域,高CPU占用率都是一个非常常见的问题,…...

echarts树图 改文本显示的地方的样式
树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…...

MYDB运行环境的搭建
前言 再将该项目跑起来之前,我想你的环境应该是准备的差不多啦!只需要稍稍的配置一下即可。 我在本地已经跑通了,说是兼容JDK8,但我本地刚好有11就用了11啦,跑起来的方法在仓库的 readme 里写的很清楚。 在运行mvn c…...
Flink Stream API实践
目录 Flink程序的基本构成 获得执行环境(environment) 加载/初始化数据(source) 基于文件 基于socket 基于集合 自定义 转换操作(transformation) 基本转换 物理分区 任务链和资源组 名称和描述…...

AI图像生成-原理
一、图像生成流程总结 【AI绘画】深入理解Stable Diffusion!站内首个深入教程,30分钟从原理到模型训练 买不到的课程_哔哩哔哩_bilibili 二、如果只是用comfy UI生成图片 1、找到下面几个文件,把对应模型移动到对应文件夹即可使用 2、选择对…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
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 开发者设计的强大库ÿ…...