使用getopt处理参数

news2024/9/20 22:25:00

文章目录

  • 使用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,执行会报错!

 
 
 
 
 

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

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

相关文章

2022 RoboCom省赛题目解析

题目解析&#xff1a;这就是一题很简单的模拟&#xff0c;直接上代码&#xff1b; #include<iostream> using namespace std; const int N 10010; int arr[N]; int main() {int n , m;cin >> n >> m;int sum 0;int res 0;for(int i 0; i < n;i ) cin…

大学生暑假“三下乡”社会实践工作新闻投稿指南请查收!

近年来&#xff0c;大学生暑期“三下乡”社会实践工作方兴未艾&#xff0c;越来越多的大学生通过参与“三下乡”实践工作&#xff0c;走出校园&#xff0c;深入基层&#xff0c;体验农村生活&#xff0c;服务农民&#xff0c;促进农村经济社会发展&#xff0c;实现了理论与实践…

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法&#xff1a; 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…

CSS技巧专栏:一日一例 4.纯CSS实现两款流光溢彩的酷炫按钮特效

大家好&#xff0c;今天是 CSS技巧专栏&#xff1a;一日一例 第三篇《纯CSS实现两款流光溢彩的酷炫按钮特效》 先看图&#xff1a; 特此说明&#xff1a; 本专题专注于讲解如何使用CSS制作按钮特效。前置的准备工作和按钮的基本样式&#xff0c;都在本专栏第一篇文章中又详细…

k8s集群部署mysql8主备

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 动态存储类自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…

Java | Leetcode Java题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution {public int maximalSquare(char[][] matrix) {int maxSide 0;if (matrix null || matrix.length 0 || matrix[0].length 0) {return maxSide;}int rows matrix.length, columns matrix[0].length;int[][] dp new in…

【视频】R语言广义加性模型GAMs非线性效应、比较分析草种耐寒性实验数据可视化

全文链接&#xff1a;https://tecdat.cn/?p36979 原文出处&#xff1a;拓端数据部落公众号 广义加法模型&#xff08;Generalized Additive Models, GAMs&#xff09;作为一种高度灵活的统计工具&#xff0c;显著扩展了广义线性模型&#xff08;Generalized Linear Models, …

【zabbix7】开启HTTP authentication实现单点登录

开启HTTP authentication实现单点登录 一、新建http验证用户 htpasswd -c /etc/nginx/.htpasswd another_username # 在提示中输入密码二、新建Nginx配置文件 把zabbix.conf拷贝一份&#xff0c;然后修改listen监听的端口。 cp zabbx.conf zabbix_http.conf 每个location中新…

【鸿蒙学习笔记】元服务

官方文档&#xff1a;元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…

OWASP ZAP

OWASP ZAP简介 开放式Web应用程序安全项目&#xff08;OWASP&#xff0c;Open Web Application Security Project&#xff09;是一个组织&#xff0c;它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。ZAP则是OWASP里的工具类项目&#xff0c;也是旗舰项目&a…

Postman:Body类型中的x-www-from-urlencoded参数可以接受GET请求吗?

不可以 今天学习Spring Web MVC&#xff0c;在借助Postman学习 RequestMapping 注解时&#xff0c;发现Body类型中的x-www-from-urlencoded参数不支持GET请求。 按理说 RequestMapping 注解可以支持全部类型的请求&#xff0c;但为何在这里不能支持GET请求呢&#xff1f; 以下是…

Docker 基本管理及部署

目录 1.Docker概述 1.1 Docker是什么&#xff1f; 1.2 Docker的宗旨 1.3 容器的优点 1.4 Docker与虚拟机的区别 1.5 容器在内核中支持的两种技术 1.6 namespace的六大类型 2.Docker核心概念 2.1 镜像 2.2 容器 2.3 仓库 3.安装Docker 3.1 查看 docker 版本信息 4.…

Hvv工具推荐——IWannaGetAll

OA基本上是每次hvv中都会被突破的&#xff0c;基本上也都会爆出各种各样的0day&#xff0c;如果真的0day防不住&#xff0c;那我们必须要把1day、nday做一遍检查。 IWannaGetAll 是一款专门针对主流OA&#xff08;办公自动化&#xff09;系统的漏洞检测和利用工具。 IWannaGe…

C# WinForm —— 37 TabControl 控件介绍

1. 简介 管理一个TabPages集合的控件&#xff0c;也是一个分组控件 如果一个模块有多个子页面&#xff0c;可以使用TabControl控件进行页面切换 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Alignment确定选项卡是否显示在控件的…

每日刷题(二分图,二分查找,dfs搜索)

目录 1.P3853 [TJOI2007] 路标设置 2.P1129 [ZJOI2007] 矩阵游戏 3.P1330 封锁阳光大学 4.Trees 5.P1141 01迷宫 1.P3853 [TJOI2007] 路标设置 P3853 [TJOI2007] 路标设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先求出每个路标之间的距离&#xff0c;再二分查找每…

渔人杯——RE

贪吃蛇的秘密 修改代码后&#xff0c;报了一个错 # uncompyle6 version 3.9.1 # Python bytecode version base 3.7.0 (3394) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: snake1.py…

渐变且描边文字

效果&#xff1a; 用 background-image&#xff1a;linear-gradient实现渐变、 text-shadow实现描边 元素同时添加&#xff1a; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(143, 180, 253, 1));-webkit-background-clip: text;background-…

笔记本电脑数据丢失如何恢复?

在计算机网络日益普及的今天&#xff0c;计算机已波及到人们的生活、工作、学习及消费等广泛领域&#xff0c;其服务和管理也涉及政府、工商、金融及用户等诸多方面。笔记本电脑等电子产品被各行各业的人所喜爱和接受&#xff0c;早已成为人们出差的必备品&#xff0c;可以用来…

彻底解决找不到d3dcompiler_43.dll问题,总结几种有效的方法

运行软件时提示找不到d3dcompiler_43.dll无法继续执行代码&#xff0c;如何解决&#xff1f;解决这个问题的方法有很多&#xff0c;但具体问题需要具体分析&#xff0c;有些方法可能并不适用于解决d3dcompiler_43.dll的问题。因此&#xff0c;需要根据实际情况来选择合适的方法…

【LeetCode:1071. 字符串的最大公因子 + 模拟 + 最大公约数】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…