Day05-SHELL自动化编程-数组-三剑客进阶

Day05-SHELL自动化编程-数组-三剑客进阶

  • 14 Shell编程-数组
    • 14.1 概述
    • 14.2 Shell数组赋值
    • 14.3 案例
    • 14.4 小结
  • 15. Shell-编程-Debug全流程
    • 15.1 书写习惯
    • 15.2 调试方法
  • 16. 再战三剑客
    • 16.1 sed与变量
    • 16.2 awk
      • 1)指哪打哪-案例
      • 2)awk的判断与循环
      • 3)awk数组
  • 17. 总结

14 Shell编程-数组

14.1 概述

  • 数组也是一种变量.

  • 数组可以存放多个 相关联内容 ,通过访问数组调用结果(值)

  • 应用场景:用于存放相关的数据。

  • 如何创建数组(手动)

[root@m01 devops-shell]# ip_array=(10.0.0.61 10.0.0.62 10.0.0.63 10.0.0.64)
[root@m01 devops-shell]# echo ${ip_array}
10.0.0.61
[root@m01 devops-shell]# echo ${ip_array[0]}
10.0.0.61
[root@m01 devops-shell]# echo ${ip_array[2]}
10.0.0.63
[root@m01 devops-shell]# echo ${ip_array[*]}
10.0.0.61 10.0.0.62 10.0.0.63 10.0.0.64
[root@m01 devops-shell]# echo ${#ip_array[*]}
4
[root@m01 devops-shell]# for n in ${ip_array[*]}
> do
> echo $n
> done
10.0.0.61
10.0.0.62
10.0.0.63
10.0.0.64
[root@m01 devops-shell]# for((i=0;i<=${#ip_array[*]};i++))  # <=有误
> do
> echo $i ${ip_array[i]}
> done
0 10.0.0.61
1 10.0.0.62
2 10.0.0.63
3 10.0.0.64
4
[root@m01 devops-shell]# for((i=0;i<${#ip_array[*]};i++)); do echo $i ${ip_array[i]}; done
0 10.0.0.61
1 10.0.0.62
2 10.0.0.63
3 10.0.0.64

ip_array数组
ip_array[0] 数组中的某个元素  0表示下标,元素名称

输出数组中所有值

echo ${ip_array[@]}
echo ${ip_array[*]}

计算数组的元素的个数

echo ${#ip_array[@]}
echo ${#ip_array[*]}

课外知识:了解

shell数组,下标或元素名字,默认只能是数字。

要在shell数字中,下标中使用字符串,需要创建关联数组。(awk中使用更多,默认就是这个)

shell数组的循环

推荐的形式

names=(web01 web02 db01 nfs01 backup)
for n  in  ${names[@]}
do
     ping -c 1 -W 1  $n  
done

了解的形式

names=(web01 web02 db01 nfs01 backup)
for((i=0;i<${#names[@]};i++))
do
     ping -c 1 -W 1  ${names[i]}  
done

14.2 Shell数组赋值

shell数组创建(赋值)具体形式应用场景
批量直接赋值array=(ip01 ip02 ip03 ip04 )
array=( 命令结果 ) # cat ip.txt 三剑客命令获取指定内容
应用最多
逐个元素赋值array[0]=lidao array[1]=oldboy array[2]=oldwang
几乎不会使用
read命令赋值read -p “输入数组中内容:” -a array 可以创建数组,空格分割即可用于连续读取数据,用户输入3个数
cat ip.txt
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
ip_list=(`cat ip.txt`)
echo ${ip_list[@]}
10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8 10.0.0.9
echo ${#ip_list[@]}
5

14.3 案例

案例33: 试编写一个Shell程序,该程序能接收用户从键盘输入的10个整数,然后求出其总和、平均值

  • 方法00:
    • 用户输入数字 10个存放变量中或数组中.
    • 存完后,进行计算与统计
[root@m01 devops-shell]# cat 33-calc_num.sh
#!/bin/bash
##############################################################
# File Name:33-calc_num.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc: 读取用户写入的10个数字,然后计算总和,平均值
##############################################################

tmp_file=${0}_$$.txt

#0.检查输入是否为数字,或q退出
check_num() {
  if [ "$num" = "q" ]
  then
    echo "输入完成,准备进行计算"
    break
  fi
  if [[ ! $num =~ ^[0-9]+$ ]]
  then
    echo "输入异常,请重新输入数字"
    continue
  fi  
}

#1.死循环读取用户输入,按q退出
read_num() {
while :
do
  read -p "请逐个输入数字,完成后按q结束:" num
  check_num
  #需求向变量中追加内容读取变量内容后写入到文件
  echo $num >>$tmp_file
done
}

#2.计算与输出
calc_num() {
  num_array=(`cat $tmp_file`)
  sum=0
  for n in ${num_array[@]}
  do
    let sum=sum+n
  done
  #计算平均值
  clear
  echo "总数:$sum"
  echo "平均值:"
  echo "$sum/${#num_array[@]}" | bc -l
}

#3.main
main() {
  read_num
  calc_num
}
main

[root@m01 devops-shell]# sh 33-calc_num.sh 
请逐个输入数字,完成后按q结束:1
请逐个输入数字,完成后按q结束:2
请逐个输入数字,完成后按q结束:2
请逐个输入数字,完成后按q结束:3
请逐个输入数字,完成后按q结束:
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:4
请逐个输入数字,完成后按q结束:44
请逐个输入数字,完成后按q结束:4
请逐个输入数字,完成后按q结束:r
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:er
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:ewr
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:r
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:wwe
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:rw
e输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:r
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:wer
输入异常,请重新输入数字
请逐个输入数字,完成后按q结束:23
请逐个输入数字,完成后按q结束:12
请逐个输入数字,完成后按q结束:q
输入完成,准备进行计算
总数:95
平均值:
10.55555555555555555555

精简版read+awk

[root@m01 /server/scripts/devops-shell]# read -p "请输入数字以空格分割:" num
请输入数字以空格分割:12312 5 56 6 67
[root@m01 /server/scripts/devops-shell]# echo $num|xargs -n1|awk '{sum=sum+$1}END{print sum,sum/NR}'
12446 2489.2

14.4 小结

  • 如何赋值(如何创建)(通过命令结果)。
  • 如何取值,统计数组元素的个数。
  • 数组与for循环。
  • 未来常用的是awk数组。

15. Shell-编程-Debug全流程

15.1 书写习惯

书写习惯
注释
变量 :在脚本中尽量使用变量,变量命名规范(给变量加上说明)。
函数 :代码中尽可能使用函数,增加说明。 模块化.
返回值 : 尽可能增加函数return功能,方便后期调试。
参数与选项检查 : 进可能增加exit 返回值的功能,方便后期调试。
书写的时候适当增加 输出 :书写代码的时候,可以多写一些echo用于在某些步骤中进行输出。
缩进 :代码注意缩进。
成对的符号提前输入好. “” [] {}

15.2 调试方法

调试方法说明
-x大部分时候使用:sh /bash -x显示详细的执行过程。
精确显示过程脚本使用functions函数库,脚本过大,可以在脚本中使用
set -x 开始显示详细信息
代码
set +x 关闭显示详细信息
注释法使用函数,注释法。注释多余的函数,排除。缩小范围定位问题
输出关键变量变量后增加echo输出变量内容。查看过程。
  • 大部分时候使用:sh -x显示详细的执行过程。

  • 排除法

16. 再战三剑客

16.1 sed与变量

案例34-sed命令中如何调用变量

cat ip.txt
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
src=10.0.0
dst=172.16.1
sed "s#$src#$dst#g" ip.txt
172.16.1.5
172.16.1.6
172.16.1.7
172.16.1.8
172.16.1.9

16.2 awk

1)指哪打哪-案例

案例35-过滤出/etc/passwd的第2到9行的第1列和第3列

awk -F: 'NR>=2 && NR<=9{print $1,$3}' /etc/passwd
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8

案例36-第1列用户名等于root的最后一列(命令解释器)。

awk -F: '$1=="root"{print $NF}' /etc/passwd
/bin/bash
awk -F: '$1==root{print $NF}' /etc/passwd

案例37-进阶:第1列用户名等于root的最后一列(命令解释器)。 使用变量方法

[root@m01 devops-shell]# name=root
[root@m01 devops-shell]# awk -F: -vn=$name '$1==n' /etc/passwd
root:x:0:0:root:/root:/bin/bash

awk -vn=$name  '$1==n{print $NF}' /etc/passwd
awk -F: -vn=$name  '$1==n{print $NF}' /etc/passwd
awk -F: -vn=$name  '$1~n{print $NF}' /etc/passwd

案例38-过滤出网卡文件中ip地址那行

awk -F= '/IPADDR/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
10.0.0.61

2)awk的判断与循环

a)判断(了解)

如果系统根分区磁盘使用率大于80,提示磁盘空间不足

df -h|awk '$NF=="/"{ if($5>=8) print "磁盘空间不足" }'
磁盘空间不足
df -h|awk '$NF=="/"{ if($5>=8) print "磁盘空间不足" }'
awk '$NF=="/"{
  if($5>=8)
  print "磁盘空间不足"  
  }'  
 awk 'NR<=5' /etc/passwd
    awk '{if(NR<=5){print $0}}' /etc/passwd
    awk '{
           if(NR<=5){
             print $0
           }
         }' /etc/passwd
         
         
[root@m01 devops-shell]# df -h|awk -F"[ %]+" '$NF=="/"{if($(NF-1)>=5 ) print "磁盘空间不足" }'
磁盘空间不足
[root@m01 devops-shell]# df -h|awk -F"[ %]+" '$NF=="/" && $(NF-1)>=5 { print "磁盘空间不足" }'
磁盘空间不足

b) 循环(了解)

awk 'BEGIN{for(i=1;i<=100;i++) {sum=sum+i} print sum }'
awk 'BEGIN{
   for(i=1;i<=100;i++) 
      {sum=sum+i} 
   print sum  
   }'

计算任意数字的总和.

[root@m01 ~]# read -p "请输入数字空格分割:" num
请输入数字空格分割:1 2 4 5 66
[root@m01 ~]# echo $num 
1 2 4 5 66
[root@m01 devops-shell]# echo $num |awk '{for(i=1;i<=5;i++) sum=sum+$i ; print sum }'
78
[root@m01 devops-shell]# echo $num |awk '{for(i=1;i<=NF;i++) sum=sum+$i ; print sum }'
78

3)awk数组

a) 概述

  • awk数组专用于统计与分析。

    • 去重统计次数(sort+uniq)。
    • 去重求和。
  • awk数组与shell数组区别

    • awk数组: 关联数组,下标啥都行。
    • shell数组:普通数组,下标数字,shell中也有关联数组。

b) 使用

创建

awk 'BEGIN{ array[0]="lidao996";array["lidao"]=996;array[110]="sos" }'

取值

[root@oldboy-devops-shell ~]# awk 'BEGIN{
   array[0]="lidao996";
   array["lidao"]=996;
   array[110]="sos"; 
   print array[0]           
}'
lidao996
[root@oldboy-devops-shell ~]# awk 'BEGIN{ 
   array[0]="lidao996";
   array["lidao"]=996;
   array[110]="sos"; 
   print array["lidao"] 
}'           
996

[root@m01 devops-shell]# awk 'BEGIN{ array[0]="lidao";array["boss"]="oldboy";print array[0] }'
lidao
[root@m01 devops-shell]# awk 'BEGIN{ array[0]="lidao";array["boss"]="oldboy";print array[0],array["boss"] }'
lidao oldboy
[root@m01 devops-shell]# awk 'BEGIN{ array[0]="lidao";array["boss"]="oldboy"; for( n in array  ) print n }'
boss
0
[root@m01 devops-shell]# awk 'BEGIN{ array[0]="lidao";array["boss"]="oldboy"; for( n in array  ) print n,array[n] }'
boss oldboy
0 lidao

循环(专用循环)

awk专用于数组的循环
for(n  in 数组名字)
   print n(数组下标),数组名字[n]
   
 awkfor循环 数组专用循环
变量n,获取数组下标
数组名字[下标]才是对应的值
awk 'BEGIN{ 
arr 
for (n in array) 
   print n,array[n]
}'
110 sos
0 lidao996
lidao 996

c) 案例

批量赋值

cat awk-array.txt
img.oldboylinux.cn 6
bbs.oldboylinux.cn 7
avi.oldboylinux.cn 99
mp4.oldboylinux.cn 88
要求:
1.创建以url为下标,元素值是次数数组。输出数组内容。
[root@m01 devops-shell]# cat /server/files/awk_array.txt
img.oldboylinux.cn 6
bbs.oldboylinux.cn 7
avi.oldboylinux.cn 99
mp4.oldboylinux.cn 88
[root@m01 devops-shell]# awk '{ array[$1]=$2 }END{ for( n in array )print n,array[n] }' /server/files/awk_array.txt
img.oldboylinux.cn 6
avi.oldboylinux.cn 99
bbs.oldboylinux.cn 7
mp4.oldboylinux.cn 88
[root@m01 devops-shell]# awk '{ array[$1]=$2 }END{ for( n in array )print n,array[n] }' /server/files/awk_array.txt|sort -rnk2
avi.oldboylinux.cn 99
mp4.oldboylinux.cn 88
bbs.oldboylinux.cn 7
img.oldboylinux.cn 6

案例39-去重统计次数

分析文件中每个域名出现的次数
cat /server/files/url.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

[root@m01 devops-shell]# awk -F"[/.]+" '{ array[$2]=array[$2]+1 }END{ for( n in array )print n,array[n] }' /server/files/url.txt
www 3
mp3 1
post 2
[root@m01 devops-shell]# awk -F"[/.]+" '{ array[$2]++ }END{ for( n in array )print n,array[n] }' /server/files/url.txt
www 3
mp3 1
post 2

在这里插入图片描述

统计ip地址访问次数。
awk '{url[$1]Վҡ}END{ for(name in url )print name,url[name]}' access.log |sort -rnk2 |head

案例40-统计access.log中每个ip地址的流量总数。
第1列是ip地址
第10列是流量(单位是字节)

[root@m01 devops-shell]# awk '{ array[$1]=array[$1]+$10 }END{ for( n in array )print n,array[n] }' /server/files/access.log |sort -rnk2|head
157.55.39.187 1254922
117.63.25.97 446568
47.103.21.203 179675
47.103.14.133 173519
106.14.11.104 171321
207.46.13.186 156643
207.46.13.90 104867
61.147.15.67 95592
157.55.39.4 89426
83.97.20.34 85840
[root@m01 devops-shell]# awk '{ array[$9]=array[$9]+$10 }END{ for( n in array )print n,array[n] }' /server/files/access.log |sort -rnk2|head
200 2805703
302 588708
404 106083
400 7494
301 75
Vezir.04 0
SP1 0
499 0
150 0
"-" 0

本质:ip地址是一样的然后把第10列相加。
本质: 最后输出结果
# i=i+1 == i++
# sum=sum+xxx

# array[$1]=array[$1]+1 == array[$1]++
# array[$1]=array[$1]+$10

awk与shell语法格式对比

具体语法awkshell编程
if单分支判断if (条件)
{命令
多个命令}
if 条件;then
命令
fi
if双分支判断if (条件)
{命令}
else
{命令}
if 条件;then
命令

else
命令
fi
for循环:c语言形式for(i=1;i<=10;i++)
{命令}
for(i=1;i<=10;i++)
do
{命令}
done
for循环:通用awk专用于数组的循环
for( n in 数组名字)
print n(数组下标),数组名字[n]
for n in 清单
do
{命令}
done

17. 总结

  • shell编程环境
  • shell执行方式sh/bash
  • 变量取值,赋值,命名.
  • 普通变量${} ,环境变量(了解)
  • 案例-登录系统后输出基本信息。
  • 特殊变量 $n, 0 , 0, 0,#,$?
  • 其他特殊变量:能够认识,知晓含义即可.
  • 今日案例:多种命令,多种传参方式实现计算器

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

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

相关文章

【HDFS存储】Java语言实现

Hadoop生态系统中包含多种与其相关联的技术应用&#xff0c;主要包括但不限于HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff1a;作为一个高度可靠、高吞吐量的分布式文件系统&#xff0c;它是Hadoop核心技术之一&#xff0c;用于存储海量数据。 J…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

将Ubuntu18.04默认的python3.6升级到python3.8

1、查看现有的 python3 版本 python3 --version 2、安装 python3.8 sudo apt install python3.8 3、将 python3.6 和 3.8 添加到 update-alternatives sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --insta…

【C++】1.从C语言转向C++

目录 一.对C的认识 二.C的关键字 三.命名空间 3.1命名空间的定义 3.2命名空间的使用 四.C的输入与输出 五.缺省参数 5.1全缺省参数 5.2半缺省参数 六.函数重载 七.引用 7.1引用的特性 7.2引用和指针的区别 八.内联函数 九.auto关键字&#xff08;C1…

聚焦价值提升与市场扩张,ATFX任命Ergin Erdemir为拉丁美洲地区负责人

日前&#xff0c;全球知名品牌ATFX宣布一项重磅人事任命&#xff0c;Ergin Erdemir履新拉丁美洲地区负责人。我们相信通过这一重要战略举措&#xff0c;能够加强品牌在全球最具活力地区之一的拉美业务增长的承诺&#xff0c;并巩固品牌在当地的知名度和影响力。 Ergin Erdemi…

【noVNC】使用noVNC实现浏览器远程VNC(基于web的远程桌面)

一、操作的环境 windows 10系统乌班图 Ubuntu 22 二、noVNC 部署方式 原理&#xff1a;开启 Websockify 代理来做 WebSocket 和 TCP Socket 之间的转换 2.1 noVNC和VNC服务端同一台机器 使用方式&#xff0c;查看另一篇博文 &#xff1a;【noVNC】使用noVNC实现浏览器网页访…

锐化空间滤波器--二阶微分图像增强(提高清晰度的另一种方式)

书上一阶微分的定义可以理解&#xff0c;毕竟这里不死数学上的曲线的概念&#xff0c;而是像素点上的曲线。所以&#xff0c;不同于数学的严格单调递增曲线的导数是大于等于零&#xff0c;这里的严格单调递增曲线&#xff0c;只能是大于零。 至于二阶微分的定义&#xff0c;就…

虚拟机中,IP地址查询失败怎么办

有时候ifconfig查出来的地址是下面这样&#xff0c;只有ipv6 只需要运行下面这两条命令&#xff0c;再次查询即可成功&#xff01; systemctl stop NetworkManagersystemctl start network.service

RISC-V特权架构 - 模式切换与委托

RISC-V特权架构 - 模式切换与委托 1 导致模式切换的常见动作2 异常处理规则3 异常处理时模式切换3.1 在U模式下&#xff0c;发生异常3.2 在S模式下&#xff0c;发生异常3.3 在M模式下&#xff0c;发生异常 4 系统调用时模式切换5 中断处理时模式切换 本文属于《 RISC-V指令集基…

第6章 6.3.1 正则表达式的语法(MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 正则表达式可以由一般的字符、转义字符、元字符、限定符等元素组…

三十 超级数据查看器 教程 详情界面的便捷功能

三十 超级数据查看器 教程 详情界面的便捷功能 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 豌豆荚 下载地址 大家好&#xff0c;今天我们讲一下超级数据查看器的便捷功能。 便捷功能为了在详情界面快速操作 首先&#xff0c;我们打开超级数据查看器&…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

FPGA在医疗的应用,以4K医疗内窥镜为例

前言 随着技术的发展&#xff0c;医学影像作为科学技术的主要成就之一&#xff0c;在无创诊断和治疗领域已经有了多种应用。其中一个应用是内窥镜&#xff0c;在20世纪90年代&#xff0c;当利用电荷耦合装置将图像传输到显示器上成为可能时&#xff0c;内窥镜变得更加广泛。为…

K8S node节点执行kubectl get pods报错

第一个问题是由第二个问题产生的&#xff0c;第二个问题也是最常见的 网上找的都是从master节点把文件复制过来&#xff0c;这样确实可以解决&#xff0c;但是麻烦&#xff0c;有一个node节点还好&#xff0c;如果有多个呢&#xff1f;每个都复制吗&#xff1f;下面是我从外网…

洛谷-P2089 烤鸡

P2089 烤鸡 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N30; //const int M1e3*310; const int Mpow(3,10); int n; int arr[N]; //存临时方案 int res; //存方案数 int ans[M][N]; //存所有方案//x表示当前到…

会话跟踪技术基础:Cookie和Session

久违了&#xff0c;之前忙碌了一周赶毕设&#xff0c;今天抽空更新~ 一.理论知识 1.会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应~ 2.会话跟…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳&#xff08;纯属个人感觉&#xff09; 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目&#xff08;这里需要在hbuilder创建&#xff09; vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

远程控制软件免费

远程控制软件免费&#xff1a;选择、价值与安全性探讨 随着科技的进步和互联网的普及&#xff0c;远程控制软件在日常生活和工作中的应用越来越广泛。这类软件允许用户通过网络远程访问和控制另一台计算机&#xff0c;为远程办公、技术支持和在线教育等提供了极大的便利。本文…

2、JVM内存模型深度解析

JVM整体结构及内存模型 根据 JVM 规范&#xff0c;JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM分为五大模块&#xff1a; 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块 。 方法区Java8之后的变化 移除了 Pe…

上位机图像处理和嵌入式模块部署(qmacvisual缺失的光源控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 有些场景下面&#xff0c;是不需要光源和光源控制的&#xff0c;比如说利用摄像头识别对应区域的库位&#xff0c;这部分直接利用红外光采集对应的…