使用getopt处理参数

文章目录

  • 使用getopt处理参数
    • 1. shift 命令
      • 1.1 删除一个参数
      • 1.2 删除多个参数
      • 1.3 多次执行 shift 参数
      • 1.4 参数解析示例
      • 1.5 优化处理
      • 1.6 问题处理
    • 2. getopt 命令
      • 2.1 常用参数及示例
      • 2.2 脚本参数优化示例
      • 2.3 参数校验
    • 3. 示例展示
    • 4. eval 命令
      • 4.1 示例
        • 示例 1
        • 示例 2
        • 示例 3
        • 示例 4
        • 示例 5

使用getopt处理参数

getopt是用来解析,整理传入shell的命令行参数的命令

参考地址:B站传送门

1. shift 命令

shift 的作用就是从头部删除参数,它可以在后面各跟一个数字参数表示删除几个参数

示例:

shift 2 表示删除两个参数

常见参数使用,可以使用 $@ 输入所有参数

[root@105 dongxx]# cat a.sh 
#!/bin/bash# 输入所有参数
echo $@[root@105 dongxx]# sh a.sh a b c
a b c

在这里插入图片描述

1.1 删除一个参数

使用 shift 命令之后会发现第一个参数 a 没了

[root@105 dongxx]# cat a.sh 
#!/bin/bashshift# 输入所有参数
echo $@
[root@105 dongxx]# sh a.sh a b c
b c

在这里插入图片描述

1.2 删除多个参数

使用 shift 2 删除两个参数

[root@105 dongxx]# cat a.sh 
#!/bin/bashshift 2# 输入所有参数
echo $@
[root@105 dongxx]# sh a.sh a b c d
c d

在这里插入图片描述

1.3 多次执行 shift 参数

shift 参数还可以多次执行,可以多次执行删除多个参数

[root@105 dongxx]# cat a.sh 
#!/bin/bashshift 2
shift# 输入所有参数
echo $@
[root@105 dongxx]# sh a.sh a b c d e
d e

在这里插入图片描述

1.4 参数解析示例

需求:处理参数 -a -name zhangsan -age 18,需要分开输出为 -a -name zhangsan -age 18

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18# -a 为第一个参数,可以直接使用 $1
echo $1# 输出 $1 之后,使用 shift 删除第一个参数,那么后面的参数就是从 $1 开始了,所以这里的 $1 和 $2 就是 -name 和 zhangsan
shift
echo $1 $2# 因为 -name 选项和它的参数 zhangsan 占了两个位置,那么就需要 shift 两次了,同理,这里的 $1 就是 -age 选项 $2 就是 18 了
shift 2
echo $1 $2
[root@105 dongxx]# sh a.sh -a -name zhangsan -age 18
-a
-name zhangsan
-age 18

在这里插入图片描述

1.5 优化处理

上述案例中没有考虑参数顺序问题,如果参数顺序有不一样输出结果也就乱了,所以在脚本中不仅要能挨个拿到选项和参数,还要根据选项是有参还是无参来控制 shift 的数量,而且也并不是每个选项参数一定要用,也就是说选项参数数量是不固定的。这样我们可以使用循环来处理。

示例:

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18while true; docase "$1" in-a)echo "-a 选项"shift;;-name)echo "-name 选项,参数为 $2"shift 2;;-age)echo "-age 选项,参数为 $2"shift 2;;*)echo "非法参数"exit 1esac
done
[root@105 dongxx]# sh a.sh -a -name zhangsan -age 18
-a 选项
-name 选项,参数为 zhangsan
-age 选项,参数为 18
非法参数

在这里插入图片描述

上述脚本中有个问题,在没有参数时会提示非法参数,且参数为-a -name zhangsan -age 18时,仍提示非法参数

[root@105 dongxx]# sh a.sh 
非法参数

问题解析:

#!/bin/bash
# 参数:-a -name zhangsan -age 18while true; docase "$1" in-a)echo "-a 选项"shift;;-name)echo "-name 选项,参数为 $2"shift 2;;-age)echo "-age 选项,参数为 $2"shift 2;;*)echo "非法参数"exit 1esac
done# 当前脚本在匹配完成会后删除了所有参数,最后 $1 匹配为空会走到最后的 * 匹配,所以就会输出“非法参数”

问题处理:

#!/bin/bash
# 参数:-a -name zhangsan -age 18# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@while true; docase "$1" in-a)echo "-a 选项"shift;;-name)echo "-name 选项,参数为 $2"shift 2;;-age)echo "-age 选项,参数为 $2"shift 2;;--)break;;*)echo "非法参数"exit 1esac
done

测试

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@while true; docase "$1" in-a)echo "-a 选项"shift;;-name)echo "-name 选项,参数为 $2"shift 2;;-age)echo "-age 选项,参数为 $2"shift 2;;--)break;;*)echo "非法参数"exit 1esac
done
[root@105 dongxx]# sh a.sh 
$@: --
[root@105 dongxx]# sh a.sh -a -name zhangsan -age 18
$@: -a -name zhangsan -age 18 --
-a 选项
-name 选项,参数为 zhangsan
-age 选项,参数为 18

在这里插入图片描述

1.6 问题处理

上述测试脚本参数都是约定好的,但是在实际使用过程中可能会出现没有安装约定的方式传参的问题

示例:-a aaa -name zhangsan -age 18,那这时候参数的顺序位置就会有问题。这时我们就可以使用 getopt 来处理了

2. getopt 命令

2.1 常用参数及示例

常用命令参数

参数说明
-o指定解析段格式选项
-l指定要解析的长格式选项
分割真正需要解析的参数

示例:

[root@105 dongxx]# getopt -o a -l name:,age: -- -a --name zhangsan --age 18-a --name 'zhangsan' --age '18' --# 参数说明:-o 后跟上短格式选项-l 后跟上长格式选择,对于有参数的选项需要再参数后加个冒号,多个长格式选项用逗号隔开-- 后跟上真正需要解析的参数,而且 getopt 要求长格式选项需要使用 -- ,所以需要在选项前加上 --解析成功后会在参数最后默认加上 -- 的结束标记

测试给段格式选项 -a 增加参数 aaa,结果是没有参数输出,因为 getopt 知道 -a 选项是无参选项,所以它将跟在 a 后面的参数移动到了结束标记之后,在之前的脚步中是需要 -- 则跳出循环,所以结束标记之后的参数是不会被处理的

[root@105 dongxx]# getopt -o a -l name:,age: -- -a aaa --name zhangsan --age 18-a --name 'zhangsan' --age '18' -- 'aaa'

在这里插入图片描述

2.2 脚本参数优化示例

使用 getopt 处理一下就能解决参数位置错误导致的参数解析错乱的问题

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18# 使用 $(getopt -o a -l name:,age: -- "$@") 获取 getopt 处理后的参数信息,在使用 set -- 把这个结果设置后脚本的参数,由于 getopt 本身就有 -- 的结束标记,所以下面的 set -- "$@" -- 就不需要了
set -- $(getopt -o a -l name:,age: -- "$@")# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
# set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@while true; docase "$1" in-a)echo "-a 选项"shift;;# 为了兼容 getopt 长格式的设置,这里需要改成 --name--name)echo "-name 选项,参数为 $2"shift 2;;--age)echo "-age 选项,参数为 $2"shift 2;;--)break;;*)echo "非法参数"exit 1esac
done
[root@105 dongxx]# sh a.sh -a --name zhangsan --age 18
$@: -a --name 'zhangsan' --age '18' --
-a 选项
-name 选项,参数为 'zhangsan'
-age 选项,参数为 '18'
[root@105 dongxx]# sh a.sh -a aa --name zhangsan --age 18
$@: -a --name 'zhangsan' --age '18' -- 'aa'
-a 选项
-name 选项,参数为 'zhangsan'
-age 选项,参数为 '18'

执行测试

在这里插入图片描述

2.3 参数校验

当我们正常传参时,示例:sh a.sh -a --name zhangsan --age 18 没有问题。如果我们将有参的选项的参数去掉 sh a.sh -a --name zhangsan --age 那么就会报错

[root@105 dongxx]# sh a.sh -a --name zhangsan --age
getopt: option '--age' requires an argument
$@: -a --name 'zhangsan' --
-a 选项
-name 选项,参数为 'zhangsan'

在这里插入图片描述

问题:

​ 上述脚本中也有个问题,就是报错之后仍然会继续执行。

解决:

​ 修改脚本,在开头设置一个 set -e 让他需要非 0 状态吗自动退出。如果单纯只增加 set -e 命令,脚本同样会继续往下执行,因为在上述脚本中 getopt 是在 set -- 中执行的,getopt 报错,但是 set -- 是正常执行的,所以结果就不是一个非 0 状态。所以需要将 getopt 提取出来单独处理。

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18set -e# 将 getopt 提取出来赋值变量,那么校验失败后,set -e 就会检测到非 0 状态从而退出脚本
args=$(getopt -o a -l name:,age: -- "$@")
set -- $args# 使用 $(getopt -o a -l name:,age: -- "$@") 获取 getopt 处理后的参数信息,在使用 set -- 把这个结果设置后脚本的参数,由于 getopt 本身就有 -- 的结束标记,所以下面的 set -- "$@" -- 就不需要了
# set -- $(getopt -o a -l name:,age: -- "$@")# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
# set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@while true; docase "$1" in-a)echo "-a 选项"shift;;# 为了兼容 getopt 长格式的设置,这里需要改成 --name--name)echo "-name 选项,参数为 $2"shift 2;;--age)echo "-age 选项,参数为 $2"shift 2;;--)break;;*)echo "非法参数"exit 1esac
done
[root@105 dongxx]# sh a.sh -a --name zhangsan --age
getopt: option '--age' requires an argument

在这里插入图片描述

3. 示例展示

命令展示示例:

[root@105 dongxx]# getopt -o a:bc: -l name:,age:,man -- -a 1 -b -c 2 --name zhangsan --age 18 --man-a '1' -b -c '2' --name 'zhangsan' --age '18' --man --

脚本展示示例:

#!/bin/bash# 问题:在没有 -o 参数时会报错,这是为什么
# args=$(getopt -l name:,age:,address:,user:,passwd: -- "$@")args=$(getopt -o -a: -l name:,age:,address:,user:,passwd: -- "$@")if [[ $? != 0 ]]; thenecho "请输出正确参数"exit 1
fiecho "args: "$args
# 问题:这里为什么需要使用 eval ,暂时还不知道
eval set -- "$args"# set -- "$args"while true ;doecho "\$1: "$1case "$1" in--name)if [[ -z "$NAME" ]]; thenNAME=$2fishift 2;;--age)if [[ -z "$AGE" ]]; thenAGE=$2fishift 2;;--address)if [[ -z "$ADDRESS" ]]; thenADDRESS=$2fishift 2;;--user)if [[ -z "$USER" ]]; thenUSER=$2fishift 2;;--passwd)if [[ -z "$PASSWD" ]]; thenPASSWD=$2fishift 2;;--)break;;*)echo "参数错误,请检查"exit 1;;esac
doneecho "name: " $NAME ", age: " $AGE ", address: "$ADDRESS ", user: "$USER ", passwd: "$PASSWD

在这里插入图片描述

4. eval 命令

参考地址1

参考地址2

eval内置命令:
功能:当Shell程序执行到eval语句的时候,Shell读入参数args,并将它们组合成一个新的命令,然后执行。也就是重新运算求出参数的内容。eval可以读取一连串的参数,然后依据参数本身的特性来执行。参数不限数目,彼此之间用分号分开。

​ eval会对后面的命令进行两遍的扫描,如果第一遍扫描后,命令是普通命令,则执行此命令;如果命令中含有变量的间接引用,则保证间接引用的语义。也就是说,eval语句将会首先扫描命令行进行所有的置换,然后再进行该命令。因此,eval命令适合用于那些一次扫描无法实现其功能的变量。

eval执行分两个步骤:

​ 第一步:执行变量的替换。

​ 第二步:执行替换后的命令

4.1 示例

示例 1
[root@105 1]# cat a.sh 
#!/bin/bashecho "111 "\$$#
echo -e "\n"
echo "=============="
echo -e "\n"
eval "echo 2222 \$$#"
[root@105 1]# sh a.sh aa bb
111 $2==============2222 bb

在这里插入图片描述

脚本说明:

\$$#$# 是表示传参个数,\$ 表示转义,显示为普通字符 $ 所以第一次输出 \$$# 只进行了第一步的变量替换, 结果为 $2

​ 使用 eval 之后则进行了两次扫描,第一次是 $# 变量的替换,结果为 $2 ,然后再执行替换后的命令 $2,则结果显示 $2 的值 bb

如果我们知道参数的个数,输入两个参数 aa bb,我们可以使用 $2 来查看最后一个参数 bb。但是如果我们不知道参数个数,还想查看最后一个参数怎么办呢?我们想到 $#,传给Shell脚本的个数,echo $# 显示的其实是参数个数,而使用 eval echo "$$#" 才显示最后一个参数。和上述示例一样。

示例 2
[root@105 1]# cat test 
Hello World
[root@105 1]# aa="cat test"
[root@105 1]# echo $aa
cat test
[root@105 1]# eval $aa
Hello World

在这里插入图片描述

脚本说明:

  1. eval 命令对后面的命令进行了两次扫描,第一次将 $aa 替换为 cat test,第二次执行 cat test
  2. 这些需要进行两次扫描的变量有时也称为复杂变量。不过这些变量并不复杂。
示例 3

file 文件中,有两列数据,第一列对应 KEY ,第二列对应 VALUE ,使用 eval 命令将 KEYVALUE 的值对应起来,从文件中读取。

[root@105 1]# cat file 
NAME chang
AGE  28
SEX  nan
[root@105 1]# cat a.sh 
#!/bin/bash
while read KEY VALUE
doeval "${KEY}=${VALUE}"
done < file
echo "NAME: "$NAME", AGE: "$AGE", SEX:" $SEX
[root@105 1]# sh a.sh 
NAME: chang, AGE: 28, SEX: nan
[root@105 1]# 
[root@105 1]# sh -x a.sh 
+ read KEY VALUE
+ eval NAME=chang
++ NAME=chang
+ read KEY VALUE
+ eval AGE=28
++ AGE=28
+ read KEY VALUE
+ eval SEX=nan
++ SEX=nan
+ read KEY VALUE
+ echo 'NAME: chang, AGE: 28, SEX:' nan
NAME: chang, AGE: 28, SEX: nan

在这里插入图片描述

脚本说明:

eval "${KEY}=${VALUE}"eval 第一次扫描获取变量 ${KEY}=${VALUE} 的值,第二次进行赋值操作

示例 4
[root@105 1]# cat >a.sh<<EOF""
> #!/bin/bash
> x=100
> y=x
> eval echo \$$y
> eval $y=50
> echo $x
> eval echo \$$y
> EOF
[root@105 1]# cat a.sh 
#!/bin/bash
x=100
y=x
eval echo \$$y
eval $y=50
echo $x
eval echo \$$y
[root@105 1]# 
[root@105 1]# sh a.sh 
100
50
50

在这里插入图片描述

上面例子中的eval echo \$$y首先被读取,然后被执行:在读取的过程中,$y会被替换成x,所以读取的结果是echo $x;执行echo $x的输出就是打印了变量x的值。同理,eval $y=50会被解析成x=50,然后执行x=50的结果就是为变量x赋值。

示例 5

执行复杂的字符串形式的命令

[root@105 1]# cat a.sh 
#!/bin/bash
dirpath=/root/1
simple_cmd="ls -l $dirpath"
complex_cmd="ls -l $dirpath | awk -F ' ' '{print \$9}'"
echo '=========================='
echo '========Simple Cmd========='
echo '=========================='
eval $simple_cmd
echo '-----------------------------------'
$simple_cmd
echo '==========================='
echo '========Complex Cmd========='
echo '==========================='
eval $complex_cmd
echo '-----------------------------------'
$complex_cmd
[root@105 1]# 
[root@105 1]# sh a.sh 
==========================
========Simple Cmd=========
==========================
total 8
-rw-r--r-- 1 root root 467 Jul 11 21:28 a.sh
-rw-r--r-- 1 root root   5 Jul 11 21:28 test
-----------------------------------
total 8
-rw-r--r-- 1 root root 467 Jul 11 21:28 a.sh
-rw-r--r-- 1 root root   5 Jul 11 21:28 test
===========================
========Complex Cmd=========
===========================a.sh
test
-----------------------------------
ls: cannot access |: No such file or directory
ls: cannot access awk: No such file or directory
ls: cannot access ': No such file or directory
ls: cannot access ': No such file or directory
ls: cannot access '{print: No such file or directory
ls: cannot access $9}': No such file or directory
/root/1:
total 8
-rw-r--r-- 1 root root 467 Jul 11 21:28 a.sh
-rw-r--r-- 1 root root   5 Jul 11 21:28 test

在这里插入图片描述

可以看到,在执行$simple_cmd时,是否使用eval的效果是相同的。但是当我们执行一个稍微复杂一点(比如包含管道(Pipe))的字符串形式的命令时,如果不使用eval,执行会报错!

 
 
 
 
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学中的无穷小与物理学中的微元

数学中的无穷小与物理学中的微元 flyfish 数学中的直线和物理中的线比较下就容易理解了 数学中的直线&#xff1a; 数学中的直线是一种理想化的抽象概念&#xff0c;具有无限延伸且没有厚度或宽度。 直线的定义不依赖于物理性质&#xff0c;仅依赖于几何性质。它是一个一维对…

33 IRF配置思路

IRF配置思路网络括谱图 主 Ten-GigabitEthernet 1/0/49 Ten-GigabitEthernet 1/0/50 Ten-GigabitEthernet 1/0/51 备 Ten-GigabitEthernet 2/0/49 Ten-GigabitEthernet 2/0/50 Ten-GigabitEthernet 2/0/51 思路 主 1 利用console线进入设备的命令行页面去更改…

在安卓中使用FFmpeg录制摄像头的视频并保存到本地MP4文件

在移动应用开发中&#xff0c;有时需要利用设备的摄像头录制视频&#xff0c;并且希望在录制过程中能够精确控制视频的质量、格式和时长。FFmpeg作为一个强大的多媒体处理工具&#xff0c;提供了广泛的功能和选项&#xff0c;能够帮助我们实现这样的需求。 添加依赖 在安卓平台…

【C语言】C语言-身份证管理系统(源码+注释)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

关于.NETCORE站点程序部署到nginx上无法访问静态文件和无法正确生成文件的问题解决过程。

我的netcore6项目&#xff0c;部署到IIS的时候&#xff0c;生成报告时&#xff0c;需要获取公司LOGO图片放到PDF报告文件中&#xff0c;这时候访问静态图片没有问题。 然后还有生成邀请二维码图片&#xff0c;这时候动态创建图片路径和图片也没有问题&#xff0c;可以在站点的…

funasr最新更新GPU版本安装避坑

#当前安装过程没有cpu版本顺利 1.个人在自己的电脑上安装ubantu系统&#xff0c;以便使用本身的显卡功能(本人显卡NVIDIA GeForce RTX 4060)&#xff08;这里需要注意&#xff0c;更新里面有附加驱动安装驱动会导致黑屏&#xff0c;小伙伴不要心急重装系统&#xff0c;可以ctr…

Python爬虫教程第4篇-使用BeautifulSoup解析html

文章目录 Beautiful Soup简介安装Beautiful Soup快速开始如何使用Beautiful Soup中的对象TagNameAttributes多值属性 NavigableStringBeautifulSoupComment 遍历文档树子节点tag名字.contents 和 .children.descendants.strings 和 stripped_strings 父节点.parent.parents 兄弟…

git批量删除本地包含某字符串的特定分支

git批量删除本地包含某字符串的特定分支 git branch -a | grep 分支中包含的字符串 | xargs git branch -D git删除本地分支_git查看删除本地分支-CSDN博客文章浏览阅读989次。git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删…

JavaScript(9)——作用域的一些问题

如果在函数内部&#xff0c;变量没有声明直接赋值&#xff0c;也会当做全局变量看。强烈不推荐&#xff01;&#xff01; function op() {num 80}op()console.log(num) 在不同作用域下&#xff0c;可能存在变量命名冲突的情况&#xff1a; let num 10 function fn(){let num…

Spring-Spring、IoC、DI、注解开发

1、Spring是什么 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。 Spring整体架构 Spring优点&#xff1a; Spring属于低侵入设计。IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合&#xff0c;实现各个层之间的解耦&#xff0c;让我们更专注于业务…

代码随想三刷单调栈篇1

代码随想三刷单调栈篇1 739. 每日温度题目代码 496. 下一个更大元素 I题目代码 503. 下一个更大元素 II题目代码 42. 接雨水题目代码 84. 柱状图中最大的矩形题目代码 739. 每日温度 题目 链接 代码 class Solution {public int[] dailyTemperatures(int[] temperatures) {…

python库识别图像中人物的个数

要在Python中识别图像中的人物数量&#xff0c;可以使用OpenCV库来进行图像处理和特征提取&#xff0c;然后使用深度学习模型&#xff08;如YOLO、SSD或Faster R-CNN&#xff09;来识别物体。以下是一个简化的例子&#xff0c;使用OpenCV和预训练的YOLO模型来识别图像中的物体数…

5G中的RedCap

5G中的RedCap&#xff1a;降低能力的重要性和实现方式 随着5G技术的推广和普及&#xff0c;设备和终端的多样化使得网络能力的管理变得更加复杂和关键。RedCap&#xff08;Reduced Capability&#xff09;作为一个重要的概念&#xff0c;旨在解决设备能力差异对网络服务和用户…

WSGI 服务器教程:`write` 方法解析

Python WSGI 服务器教程&#xff1a;write 方法解析 在本文中&#xff0c;我们将详细解析一个用于 WSGI 服务器的 write 方法。这个方法负责处理 HTTP 响应&#xff0c;包括设置响应头和发送响应数据。我们将逐行解释该方法的工作原理&#xff0c;并提供一些背景知识&#xff…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十三章 Linux连接档

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

前台线程和后台线程(了解篇)

在多线程编程中&#xff0c;理解线程的不同类型对于编写高效、稳定的程序至关重要。特别地&#xff0c;前台线程&#xff08;Foreground Threads&#xff09;与后台线程&#xff08;Background Threads&#xff09;在行为上有着根本的区别&#xff0c;这些区别直接影响到程序的…

jdevelope安装

准备 1.jdk1.8&#xff08;已经安装不做记录&#xff09; 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址&#xff1a;https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…

【栈和队列OJ题】

栈和队列OJ题 文章目录 栈和队列OJ题1. 用队列实现栈2. 用栈实现队列3. 括号匹配问题4. 循环队列 1. 用队列实现栈 OJ链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 好的&#xff0c;我们一起来看一下题目&#xff0c;题目是这样说的 思路&…

百日筑基第十七天-消息队列入门

百日筑基第十七天-消息队列入门 基础概念 什么是消息队列&#xff1f; MQ&#xff1a;Message Queue 存放消息的队列&#xff0c;消费消息时是按照顺序&#xff08;队列先进先出&#xff09;消费的。 参与消息传递的双方称为 生产者 和 消费者 &#xff0c;生产者负责发送…

2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里。订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&…