使用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/bash

shift

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

在这里插入图片描述

1.2 删除多个参数

使用 shift 2 删除两个参数

[root@105 dongxx]# cat a.sh 
#!/bin/bash

shift 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/bash

shift 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 18

while true; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		-name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		-age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		*)
			echo "非法参数"
			exit 1
	esac
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 18

while true; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		-name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		-age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		*)
			echo "非法参数"
			exit 1
	esac
done

# 当前脚本在匹配完成会后删除了所有参数,最后 $1 匹配为空会走到最后的 * 匹配,所以就会输出“非法参数”

问题处理:

#!/bin/bash
# 参数:-a -name zhangsan -age 18

# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@

while true; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		-name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		-age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		--)
			break;;
		*)
			echo "非法参数"
			exit 1
	esac
done

测试

[root@105 dongxx]# cat a.sh 
#!/bin/bash
# 参数:-a -name zhangsan -age 18

# 这里我们可以使用 set 命令来处理,set 命令可以用来指定一个结束标记
set -- "$@" --
# 参数说明:
# set -- 为删除所有参数,在 -- 后面可以设置自定义参数,最后在添加一个 -- 作为结束标记
# 输出查看
echo "\$@: "$@

while true; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		-name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		-age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		--)
			break;;
		*)
			echo "非法参数"
			exit 1
	esac
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; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		# 为了兼容 getopt 长格式的设置,这里需要改成 --name
		--name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		--age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		--)
			break;;
		*)
			echo "非法参数"
			exit 1
	esac
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 18

set -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; do
	case "$1" in
		-a)
			echo "-a 选项"
			shift;;
		# 为了兼容 getopt 长格式的设置,这里需要改成 --name
		--name)
			echo "-name 选项,参数为 $2"
			shift 2;;
		--age)
			echo "-age 选项,参数为 $2"
			shift 2;;
		--)
			break;;
		*)
			echo "非法参数"
			exit 1
	esac
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 ]]; then
    echo "请输出正确参数"
    exit 1
fi

echo "args: "$args
# 问题:这里为什么需要使用 eval ,暂时还不知道
eval set -- "$args"

# set -- "$args"


while true ;do
	echo "\$1: "$1
	case "$1" in
		--name)
			if [[ -z "$NAME" ]]; then
				NAME=$2
			fi
			shift 2;;
		--age)
			if [[ -z "$AGE" ]]; then
				AGE=$2
			fi
			shift 2;;
		--address)
			if [[ -z "$ADDRESS" ]]; then
				ADDRESS=$2
			fi
			shift 2;;
		--user)
			if [[ -z "$USER" ]]; then
				USER=$2
			fi
			shift 2;;
		--passwd)
			if [[ -z "$PASSWD" ]]; then
				PASSWD=$2
			fi
			shift 2;;
		--)
			break;;
		*)
			echo "参数错误,请检查"
			exit 1
			;;
	esac
done

echo "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/bash

echo "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
do
    eval "${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,执行会报错!

 
 
 
 
 

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

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

相关文章

“论软件维护方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后&#xff0c;直至软件被淘汰的整个时间范围内&#xff0c;为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中&#xff0c;软件需要维护的原因是多种多样的&#xff0c; 根据维护的原因不同&#xff0c;可以将软件维护…

新火种AI|微软和苹果放弃OpenAI董事会观察员席位

作者&#xff1a;一号 编辑&#xff1a;美美 微软苹果双双不做OpenAI“观察员”&#xff0c;OpenAI能更自由吗&#xff1f; 7月10消息&#xff0c;微软当地时间周一宣布将放弃在OpenAI董事会的观察员席位&#xff0c;他们称&#xff0c;OpenAI在过去八个月中取得了“重大进展…

天润融通引领客服革新,AI大模型助力品牌服务升级

AI时代&#xff0c;消费零售品牌的客户服务应该怎么做&#xff1f; 如今消费者的关注点已经越来越复杂&#xff0c;一条毛巾&#xff0c;关注点就可以包括&#xff1a; 是否婴幼儿可用&#xff0c;是否儿童成人可用&#xff1b;是否可以直接接触皮肤&#xff1b;是否无甲醛、…

初学SpringMVC之接收请求参数及数据回显

pom.xml 文件导入 lombok 的依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示这是一个控制器 RequestParam 表示从前端接收…

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(一)

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;一&#xff09; 0. 引言1. 关于m_ll2xy和m_xy2ll2. 关于m_lldist3. 关于m_xydist4 关于m_fdist5 关于m_idist6. 总结 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0…

axios使用sm2加密数据后请求参数多了双引号解决方法

axios使用sm2加密数据后请求参数多了双引号解决 背景问题描述解决过程 背景 因项目安全要求&#xff0c;需对传给后端的入参加密&#xff0c;将请求参数加密后再传给后端 前期将axios降低到1.6.7后解决了问题&#xff0c;但最近axios有漏洞&#xff0c;安全要求对版本升级&…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

应力 (Stress) 是指单位面积上所承受的力

应力 (Stress) 是指单位面积上所承受的力 flyfish 轴向力 轴向力 (Axial Force) 是指沿着物体的纵轴施加的力。对于一根杆或柱子&#xff0c;轴向力可以是拉力或压力&#xff0c;具体取决于力的方向。 拉力 (Tensile Force)&#xff1a;使物体拉长的力。 压力 (Compressive…

上班摸鱼吗?一文详解代码生成神器-Velocity

引言 “我不是在教你学坏,而是教你如何提高生产效率。” ----------- 牛顿 人类社会能够一直进步发展出现在的文明世界,最大的一个原因就是这个世界上懒人居多,懒人为了偷懒就需要提高生产效率,效率提高节省下来的时间才能创造出艺术、娱乐以及更高效率的科学技术。程序员…

机器学习(五) -- 监督学习(7) --SVM2

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 下篇&#xff1a; 前言 tips&#xff1a;标题前有“***”的内容为补充内容&#xff0c;是给好奇心重的宝宝看的&#xff0c;可自行跳过。文章内容被“文…

kubernetes集群如何更改所有节点IP

kubernetes集群如何更改所有节点IP 情景描述更换IP前的准备工作更换IP后的工作--master更换IP后的工作--node节点重新部署之前那些服务 情景描述 我有三台服务器&#xff0c;想要将其组成了一个kubernetes集群&#xff0c;在部署之前&#xff0c;我就对其进行了固定IP的操作&a…

Adobe Illustrator 2021 for mac/Win:专业矢量图形设计的巅峰之作

Adobe Illustrator 2021作为Adobe公司旗下的旗舰矢量图形设计软件&#xff0c;无论是对于Mac还是Windows用户&#xff0c;都提供了强大而灵活的设计工具&#xff0c;让设计师们能够轻松应对各种复杂的图形设计挑战。这款软件以其卓越的性能、丰富的功能和友好的用户界面&#x…

【正点原子K210连载】第二十章 machine.I2C类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第二十章 machine.I2…

java并发编程之美-第1章 并发编程线程基础-线程的创建与运行

文章目录 1.什么是线程2. 线程创建和运行 1.什么是线程 进程是操作系统进行资源分配和调度的基本单位&#xff0c;线程是 CPU 分配的基本单位。 程序计数器用来记录线程当前要执行的指令地址。CPU一般是使用时间片轮转方式让线程轮询占用的&#xff0c;程序计数器是记录线程…

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

Java--static详解

1.static静态的意义&#xff0c;加在属性面前就为静态属性&#xff1b;加在方法面前就为静态方法 2.如图&#xff0c;定义了一个静态属性age&#xff0c;一个非静态属性score&#xff1b; 输出语句一共四句&#xff0c;其中第三句报错&#xff0c;由于静态和非静态的区别&…

EXSI 实用指南 2024 -编译环境 Ubuntu 安装篇(二)

1. 引言 在当今的虚拟化领域&#xff0c;VMware ESXi 是备受推崇的虚拟化平台&#xff0c;广泛应用于企业和个人用户中。它以卓越的性能、稳定的运行环境和丰富的功能&#xff0c;为用户提供了高效的硬件资源管理和简化的 IT 基础设施维护。然而&#xff0c;如何在不同操作系统…

安卓逆向经典案例——XX优品(uniapp)

uni-app逆向 uniapp的目录结构 有一个io文件夹&#xff0c;下面有dcloud uniapp UniApp 可以用于开发 H5 应用&#xff0c;但它不仅仅局限于 H5 应用。UniApp 的特点包括&#xff1a; 1. 跨平台&#xff1a;可以一套代码同时生成适用于多个平台&#xff08;如 iOS、Android、…

【学习笔记】4、组合逻辑电路(上)

数字电路的分类&#xff1a;组合逻辑电路&#xff0c;时序逻辑电路。本章学习组合逻辑电路。 4.1 组合逻辑电路的分析 给定的逻辑电路&#xff0c;确定其逻辑表达式&#xff0c;列出真值表&#xff0c;得到简化后的逻辑表达式&#xff0c;分析得到其功能。 3位奇校验电路 &…

仕考网:公务员考试的录取流程

公务员考试的录取流程分很多个阶段&#xff0c;以下是流程介绍&#xff1a; 1. 报名阶段&#xff1a;考生需根据公布的招聘信息和岗位要求进行报名。 2. 笔试阶段&#xff1a;公务员笔试&#xff0c;包括申论和行测两部分。 3. 成绩公布与面试资格&#xff1a;笔试合格者将获…