Linux程序之可变参数选项那些事!
一、linux应用程序如何接收参数?
1. argc、argv
Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如
ls /dev/ -l
其中参数 /dev/ 、-l都是作为参数传递给命令 ls
应用程序又是如何接收这些参数的?
通常应用程序都是从main函数开始执行,传统的main函数风格如下:
int main(int argc, char* argv[])
argc:
程序的命令行参数的数量,用于统计参数数量。
argv:
是一个指向一个字符串数组的指针,数组包含了参数,每个字符串就是一个参数,最后一个元素为0。
过一般习惯使用多级指针来操作字符串。
*char argv[]有时候我们也写成char argv,
**argv[]**是一个存放字符类型元素地址的数组。
因为 C 中是有字符串的概念的:将每个字符存放在 char 数组,最后一个元素为**\0**表示字符串的结束。
**printf(%s)**就是输出字符串。
并且一般使用argv指针来访问、处理argv[]数组的内容。
C语言中,数组就是一个指针加偏移量。
所以argv则是指向一个指针数组argv[]的指针,不用定义,直接可以用。
在argv[]数组中存放的的指针指向输入命令的各部分**(调用程序、选项、参数)**。
2. 举例
下面我们用一个实例来理解argc和argv
/*
* argc: 命令行参数的个数
* argv: 字符指针数组(指向各个命令行参数的字符指针所构成的数组)
*/
int main(int argc, char* argv[]) // 接收命令行参数
{printf("argc=%d\n",argc);for (int i = 0; i < argc; i++) {printf("argv[%d]: %s\n", i, argv[i]); // 遍历字符指针数组argv}return 0;
}
执行结果
peng@ubuntu:~/work$ ./peng arg1 arg2 arg3
argc=4
argv[0]: ./peng
argv[1]: arg1
argv[2]: arg2
argv[3]: arg3
参数与argc,argv关系如下:

二、选项
1. 选项含义
linux程序除了上述情况以外,我们还经常会遇到一个使用方法就是选项应用,
比如:ping命令
peng@ubuntu:~/work$ ping -h
Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface][-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos][-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option][-w deadline] [-W timeout] [hop1 ...] destination
参数含义:
-a:尝试将IP地址解析为主机名。
-A:使用响应数据包中的附加数据。
-b:允许ping广播地址。
-B:不允许ping广播地址。
-c count:设置要发送的数据包数量。
-d:使用SO_DEBUG选项。
-D:不将socket设为分离模式。
-f:向目标发送一个“强制”数据包。
-h:显示帮助信息。
-i interval:设置发送数据包之间的时间间隔。
-I interface:设置要使用的网络接口。
-l preload:设置发送的数据包数量。
-m mark:设置ping数据包的标记。
-M pmtudisc_option:设置MTU发现选项。
-n:不要将IP地址解析为主机名。
-O:启用原始输出。
-p pattern:设置数据包的模式。
-Q tos:设置服务类型。
-r:不使用路由表,直接发送数据包到目标主机。
-R:启用记录路由。
-s packetsize:设置数据包的大小。
-S sndbuf:设置套接字的发送缓冲区大小。
-t ttl:设置数据包的TTL值。
-T timestamp_option:设置时间戳选项。
-U:使用UDP数据包。
-v:显示详细的ping命令输出。
-V:显示ping命令的版本信息。
-w deadline:设置等待响应的时间。
-W timeout:设置等待响应的超时时间。destination:指定要ping的目标主机或IP地址。
这些 - 开头的都是选项,
[]表示可选的意思
[-aAbBdDfhLnOqrRUvV] 是无参的选项
[-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] 这些都是有参数的选项
destination 必须填写的参数
前辈们利用这点发明了“UNIX 风格”的命令,选项前面加一个横杠-,用于区分选项和参数。
2. 程序如何区分参数和选项?
在程序的代码实现中,按照 UNIX 的代码惯例,上来直接跳过第一个,然后判断指针指向的字符串第一个字符是不是-,如果是的,那么进入一个switch判断,用case列出多种支持的情况下,应该执行什么代码。
例如下面这样就可以判断选项和处理参数:
int c;
while (--argc > 0 && (*++argv)[0] == '-' {while (c = *++argv[0] {switch(c){case 'x':...break;case 'n':...break;default:printf("xxx: illegal opyion %c\n", c);...break;}}
}
3. getopt、getopt_long
事实这么处理选项参数是比较麻烦的,
linux提供了选项解析的函数:
// 头文件
#include<unistd.h>
#include<getopt.h> /*所在头文件 */
int getopt(intargc, char * const argv[], const char *optstring);
int getopt_long(int argc, char * const argv[], const char *optstring,const struct option *longopts, int*longindex);
int getopt_long_only(int argc, char * const argv[],const char *optstring,const struct option *longopts, int*longindex);
extern char *optarg; /*系统声明的全局变量 */
extern int optind, opterr, optopt;
三、getopt
1. 定义:
int getopt(int argc, char * const argv[], const char *optstring);
功能:getopt是用来解析命令行选项参数的,但是只能解析短选项: **-d 100**,不能解析长选项:**--prefix**
参数argc:main()函数传递过来的参数的个数argv:main()函数传递过来的参数的字符串指针数组optstring:选项字符串,告知 getopt()可以处理哪个选项以及哪个选项需要参数
返回:如果选项成功找到,返回选项字母;如果所有命令行选项都解析完毕,返回 -1;如果遇到选项字符不在 optstring 中,返回字符 ‘?’;如果遇到丢失参数,那么返回值依赖于 optstring 中第一个字符,如果第一个字符是 ‘:’ 则返回’:‘,否则返回’?'并提示出错误信息。
2. optstring 含义 【重要】
下边重点举例说明optstring的格式意义:
char*optstring = “ab:c::”;
单个字符a 表示选项a没有参数 格式:-a即可,不加参数
单字符加冒号b: 表示选项b有且必须加参数 格式:-b 100或-b100,但-b=100错
单字符加2冒号c:: 表示选项c可以有,也可以无 格式:-c200,其它格式错误
上面这个 optstring 在传入之后,getopt 函数将依次检查命令行是否指定了 -a, -b, -c(这需要多次调用 getopt 函数,直到其返回-1),当检查到上面某一个参数被指定时,函数会返回被指定的参数名称(即该字母)
系统声明的4个全局变量含义如下:
optarg —— 指向当前选项参数(如果有)的指针。
optind —— 再次调用 getopt() 时的下一个 argv指针的索引。
optopt —— 最后一个未知选项。
opterr —— 如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
3. 实例
说千道万,不如来一个实例:
#include<stdio.h>
#include<unistd.h>
#include<getopt.h>
int main(intargc, char *argv[])
{int opt;char *string = "a::b:c:d";while ((opt = getopt(argc, argv, string))!= -1){ printf("opt = %c\t\t", opt);printf("optarg = %s\t\t",optarg);printf("optind = %d\t\t",optind);printf("argv[optind] = %s\n",argv[optind]);}
}
- 正确输入参数,执行结果如下:
peng@ubuntu:~/work/test$ ./peng -a100 -b 200 -c 300 -d
opt = a optarg = 100 optind = 2 argv[optind] = -b
opt = b optarg = 200 optind = 4 argv[optind] = -c
opt = c optarg = 300 optind = 6 argv[optind] = -d
opt = d optarg = (null) optind = 7 argv[optind] = (null)
或者
ork/test$ ./peng -a100 -b200 -c300 -d
opt = a optarg = 100 optind = 2 argv[optind] = -b200
opt = b optarg = 200 optind = 3 argv[optind] = -c300
opt = c optarg = 300 optind = 4 argv[optind] = -d
opt = d optarg = (null) optind = 5 argv[optind] = (null)
- 输入选项参数错误的情况
peng@ubuntu:~/work/test$ ./peng -a 100 -b 200 -c 300 -d
opt = a optarg = (null) optind = 2 argv[optind] = 100
opt = b optarg = 200 optind = 5 argv[optind] = -c
opt = c optarg = 300 optind = 7 argv[optind] = -d
opt = d optarg = (null) optind = 8 argv[optind] = (null)
导致解析错误,第一个 optarg = null,实际输入参数 100,由于格式不正确造成的(可选参数格式固定)
- 参数丢失,也会导致错误
peng@ubuntu:~/work/test$ ./peng -a -b 200 -c
opt = a optarg = (null) optind = 2 argv[optind] = -b
opt = b optarg = 200 optind = 4 argv[optind] = -c
./peng: option requires an argument -- 'c'
opt = ? optarg = (null) optind = 5 argv[optind] = (null)
c选项是必须有参数的
- 命令行选项未定义,-e选项未在optstring中定义,会报错:
peng@ubuntu:~/work/test$ ./peng -t
./peng: invalid option -- 't'
opt = ? optarg = (null) optind = 2 argv[optind] = (null)
四、getopt_long
1. 定义:
int getopt_long(int argc, char * const argv[], const char *optstring,
const struct option *longopts,int *longindex);
功能:包含 getopt 功能,增加了解析长选项的功能如:--prefix --help
参数:longopts 指明了长参数的名称和属性longindex 如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是 longopts 的下标值
返回:对于短选项,返回值同 getopt 函数;对于长选项,如果 flag 是 NULL ,返回 val ,否则返回 0 ;对于错误情况返回值同 getopt 函数
2. struct option
struct option {const char *name; /* 参数名称 */int has_arg; /* 指明是否带有参数 */int *flag; /* flag=NULL时,返回value;不为空时,*flag=val,返回0 */int val; /* 用于指定函数找到选项的返回值或flag非空时指定*flag的值 */
};
参数has_arg 说明:
has_arg 指明是否带参数值,其数值可选:
no_argument 表明长选项不带参数,如:–name, --helprequired_argument 表明长选项必须带参数,如:–prefix /root或 --prefix=/rootoptional_argument 表明长选项的参数是可选的,如:–help或 –prefix=/root,其它都是错误
3. 实例
#include<stdio.h>
#include<unistd.h>
#include<getopt.h>
int main(intargc, char *argv[])
{int opt;int digit_optind = 0;int option_index = 0;char *string = "a::b:c:d";static struct option long_options[] ={ {"reqarg", required_argument,NULL, 'r'},{"optarg", optional_argument,NULL, 'o'},{"noarg", no_argument, NULL,'n'},{NULL, 0, NULL, 0},}; while((opt =getopt_long_only(argc,argv,string,long_options,&option_index))!= -1){ printf("opt = %c\t\t", opt);printf("optarg = %s\t\t",optarg);printf("optind = %d\t\t",optind);printf("argv[optind] =%s\t\t", argv[optind]);printf("option_index = %d\n",option_index);}
}
- 正确执行命令
peng@ubuntu:~/work/test$ ./long --reqarg 100 --optarg=200 --noarg
opt = r optarg = 100 optind = 3 argv[optind] =--optarg=200 option_index = 0
opt = o optarg = 200 optind = 4 argv[optind] =--noarg option_index = 1
opt = n optarg = (null) optind = 5 argv[optind] =(null) option_index = 2
或者
peng@ubuntu:~/work/test$ ./long –reqarg=100 --optarg=200 --noarg
opt = o optarg = 200 optind = 3 argv[optind] =--noarg option_index = 1
opt = n optarg = (null) optind = 4 argv[optind] =(null) option_index = 2
- 可选选项可以不给参数
peng@ubuntu:~/work/test$ ./long --reqarg 100 --optarg --noarg
opt = r optarg = 100 optind = 3 argv[optind] =--optarg option_index = 0
opt = o optarg = (null) optind = 4 argv[optind] =--noarg option_index = 1
opt = n optarg = (null) optind = 5 argv[optind] =(null) option_index = 2
- 输入长选项错误的情况
peng@ubuntu:~/work/test$ ./long --reqarg 100 --optarg 200 --noarg
opt = r optarg = 100 optind = 3 argv[optind] =--optarg option_index = 0
opt = o optarg = (null) optind = 4 argv[optind] =200 option_index = 1
opt = n optarg = (null) optind = 6 argv[optind] =(null) option_index = 2
五、getopt_long_only
getopt_long_only 函数与 getopt_long 函数使用相同的参数表,在功能上基本一致
只是 getopt_long 只将 --name 当作长参数,但 getopt_long_only 会将 --name 和 -name 两种选项都当作长参数来匹配
getopt_long_only 如果选项 -name 不能在 longopts 中匹配,但能匹配一个短选项,它就会解析为短选项。
六、综合实例
下面这个例子,是一口君从开源项目ifplug提取出来的命令提取小例子,
大家可以根据自己需要,基于这个框架,定制自己的程序。
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <getopt.h>
#include <sys/param.h>#define ETHCHECKD_VERSION "1.1"int delay_up = 0;
char *interface = "eth0";void usage(char *p) {if (strrchr(p, '/'))p = strchr(p, '/')+1;printf("%s [options]\n"" -i --iface=IFACE Specify ethernet interface (%s)\n" " -d --delay-up=SECS Specify delay time (%i)\n"" -h --help Show this help\n",p,interface,delay_up);
}void parse_args(int argc, char *argv[]) {static struct option long_options[] = {{"iface", required_argument, 0, 'i'},{"delay-up", required_argument, 0, 'd'},{"help", no_argument, 0, 'h'},{"version", no_argument, 0, 'v'},{0, 0, 0, 0}};int option_index = 0;int help = 0, _kill = 0, _check = 0, _version = 0, _suspend = 0, _resume = 0, _info = 0;for (;;) {int c;if ((c = getopt_long(argc, argv, "i:d:hv", long_options, &option_index)) < 0)break;switch (c) {case 'i' :interface = strdup(optarg);printf("interface %s\n",interface);break;case 'd':delay_up = atoi(optarg);printf("delay_up %d\n",delay_up);break;case 'h':usage(argv[0]);break;case 'v':printf("peng "ETHCHECKD_VERSION"\n");break;default:fprintf(stderr, "Unknown parameter.\n");exit(1);}}}static volatile int alarmed = 0;int main(int argc, char* argv[]) {parse_args(argc, argv);return 0;
}
下面是测试结果
- 短选项
peng@ubuntu:~/work/test$ ./param -h
param [options]-i --iface=IFACE Specify ethernet interface (eth0)-d --delay-up=SECS Specify delay time (0)-h --help Show this help
peng@ubuntu:~/work/test$ ./param -v
peng 1.1peng@ubuntu:~/work/test$ ./param -vh
peng 1.1
param [options]-i --iface=IFACE Specify ethernet interface (eth0)-d --delay-up=SECS Specify delay time (0)-h --help Show this help peng@ubuntu:~/work/test$ ./param -i eth3 -d 15
interface eth3
delay_up 15 peng@ubuntu:~/work/test$ ./param -i eth3 -d 15 -h
interface eth3
delay_up 15
param [options]-i --iface=IFACE Specify ethernet interface (eth3)-d --delay-up=SECS Specify delay time (15)-h --help Show this help
- 长选项
peng@ubuntu:~/work/test$ ./param --help
param [options]-i --iface=IFACE Specify ethernet interface (eth0)-d --delay-up=SECS Specify delay time (0)-h --help Show this helppeng@ubuntu:~/work/test$ ./param --version
peng 1.1peng@ubuntu:~/work/test$ ./param --iface eth3 --delay-up 15
interface eth3
delay_up 15
talk is cheap!
test this code!
快操练起来吧!!!
更多嵌入式linux资料,后台留言:资料
也可以加一口君好友
相关文章:
Linux程序之可变参数选项那些事!
一、linux应用程序如何接收参数? 1. argc、argv Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的? 通常应用程序都…...
【1day】泛微e-office OA系统user_page接口未授权访问漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
Midjourney绘画提示词Prompt参考教程
Midjourney绘画提示词Prompt参考教程:无需魔法使用。 一、AI工具 SparkAi: SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常…...
Altium Designer学习笔记6
原理图库的制作,SMA元件的制作: 图形不是很重要,重要的是管脚的功能。 Design Item ID和Designator两个值是要注意的。 进行Place放置,切换到原理图工作区,测试下功能。 AD9851元件库制作: 不需要再新建原…...
【问题解决】Maven密码加密
普通的maven部署方式是把maven私服的账号密码以明文的方式配置在settings.xml文件中 <server><id>deploymentRepo</id><username>xxx</username><password>123</password></server> 这种方式的配置很容易被别人看到从而泄漏…...
vue3基于vite打包
大的js和css打包成:gzip npm install vite-plugin-compression 在vite.config.ts中配置: import viteCompression from vite-plugin-compressionplugins:[viteCompression({verbose:true,//控制台输出压缩结果disable:false,//开启还是禁用threshold:…...
前端使用JWT时无法获取Authorization请求头
是因为后端没有解决跨域问题: 补充下面的代码即可 response.setHeader("Access-Control-Expose-Headers", "Authorization");...
postman定义公共函数这样写,测试组长直呼牛逼!!!
postman定义公共函数 在postman中,如下面的代码: 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}:实际结果: ${actual} , 期望结果:${expected}]actualexpected…...
单元测试实战(六)其它
为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试 单元测试实战&am…...
jmeter 主从配置
配置 主从需要在同一子网。 可以修改从机的端口,主要是防火墙的原因,这样就可以在防火墙只配置一个端口,如果没有防火墙,可以不用配置 server_port1099 server.rmi.localport1099 centos防火墙开端口 sudo firewall-cmd --zonep…...
4
【任务 1】容器云平台搭建[5 分] 【题目 1】平台部署–部署容器云平台[1.5 分] 【题目 2】平台部署–部署 Istio 服务网格[0.5 分] 【题目 3】平台部署–部署 KubeVirt 虚拟化[1 分] 【题目 4】平台部署–部署 Harbor 仓库及Helm 包管理工具[1 分] 【题目 5】集群管理–备份 ET…...
C++ Day04 this指针,友元函数,重载
this指针 概念 谁调用 this 所在的函数 ,this 就存储谁的地址 特点 1, 在当前类的非静态成员函数中调用本类非静态成员时 , 默认有 this 关键字 2, 静态成员函数 , 没有 this 指针。 示例 #include <iostream> #include <cstring> using namespace std; class S…...
2023做车载测试真的可以远离内耗!转行车载月入20K!
2023年,车载测试正处于一个发展阶段,随着新能源汽车的蓬勃发展,电气化、智能化逐渐成为发展趋势。在汽车开发过程中,测试是非常重要的一个环节。现在软件越来越多地被应用到汽车上,对软件测试的需求也越来越多、越来越…...
LINUXZ
10.6.2 AT24C02 访问方法 设备地址 从芯片手册上可以知道,AT24C02 的设备地址跟它的 A2、A1、A0 引脚有关: 图 10.36 AT24C02 设备地址引脚配置 294 / 577 打开 I2C 模块的原理图: 开发板配套网盘资料\04_开发板原理图\ 04_Extend_modules\通…...
C#单例模式懒汉式与饿汉式
单例模式一般分为懒汉模式和饿汉模式,懒汉式单例在第一次引用时创建实例,不是在类加载时;饿汉式单例模式是一种在类加载时就创建实例的方式,因此也称为静态初始化。 单例模式实现的技巧时构造私有,向外提供静态实例。…...
小微初创企业,如何利用媒体宣传快速成长
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 对于小微初创企业来说,利用媒体宣传可以快速提升品牌知名度、扩大影响力,进而促进企业的成长。 1.确定宣传目标:是增加销售、提升品牌知名度、还是推…...
【封装UI组件库系列】全局样式的定义与重置
封装UI组件库系列第二篇样式 🌟前言 🌟定义全局样式 生成主题色和不同亮度的颜色 编辑 中性色及其他变量 🌟样式重置 🌟总结 🌟前言 在前端开发中,大家…...
opencv将32位深图片合成视频跳帧解决办法
在合成视频时候,大多数的图片都是24位深度的(即RGB三通道,一个通道8位),但是也存在少量的32位深的图片(RGBA,三个颜色通道加上A这个透明度通道),32位和24位的格式是不一样…...
华为obs上传下载-Java版 2023-11-23
弄了半天,老师帮弄成功了,经过同意,分享到网上,希望能帮助更多人,至于怎么弄的,我也不知道。 创建idea项目后,项目结构,对应文件没有的创一个 pom.xm 注意改Java版本,我…...
2023年中国农业机器人行业市场规模及发展趋势分析[图]
农业机器人是一种机器,是机器人在农业生产中的运用,是一种可由不同程序软件控制,以适应各种作业,能感觉并适应作物种类或环境变化,有检测(如视觉等)和演算等人工智能的新一代无人自动操作机械。 农业机器人分类 资料来源…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
