shell语法总结一(持续补充)

news2024/11/28 6:46:28

在这里插入图片描述

文章目录

  • 一、变量
    • 1、变量的命名规则
    • 2、查看变量
    • 3、删除命令
    • 4、变量的作用域
      • 4.1、局部变量
      • 4.2、全局变量
      • 4.3、环境变量
    • 5、自定义变量
    • 6、只读变量
  • 二、字符串
    • 1、单引号
    • 2、双引号(用的多)
    • 3、拼接字符串
    • 4、获取字符串的长度
    • 5、提取子字符串
  • 三、shell数组
    • 1、定义数组
    • 2、读取数组
    • 3、获取数组的长度
  • 四、Shell 注释
    • 1、单行注释
    • 2、多行注释
  • 五、传递参数(特殊变量)
  • 六、基本运算符
    • 1、算数运算符
      • 等于、不等于
    • 2、关系运算符
    • 3、布尔运算符
    • 4、逻辑运算符
    • 5、字符串运算符
    • 6、文件测试运算符
  • 七、echo命令
    • 1、显示普通字符串
    • 2、显示换行
    • 3、显示不换行
    • 4、显示结果定向至文件
    • 5、显示命令执行结果
  • 八、if语句
    • 1、if语句语法格式:
    • 2、if—else语句语法格式:
    • 3、if—elif—else 语法格式:
    • 4、案例
  • 九、for循环
    • 1、语句格式:
    • 2、案例:顺序输出当前列表中的数字
    • 3、案例:顺序输出字符串中的字符
  • 十、while循环
    • 1、语法格式为:
    • 2、案例:输入一个数,计算1到这个数的和
    • 3、无限循环格式
  • 十一、case语句
    • 1、语法格式
    • 2、案例
    • 3、跳出循环:break

一、变量

1、变量的命名规则

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

注意,变量名和等号之间不能有空格

ubuntu@VM-24-12-ubuntu:~/20221212$ name= "shell"

Command 'shell' not found, did you mean:

定义变量的时候,值可以带引号,也可以不带引号;
如果后面的值包含空格,需要带引号

ubuntu@VM-24-12-ubuntu:~/20221212$ name=hello shell

Command 'shell' not found, did you mean:

ubuntu@VM-24-12-ubuntu:~/20221212$ name="hello shell"

2、查看变量

echo $变量名
echo ${变量名}

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

ubuntu@VM-24-12-ubuntu:~/20221212$ name="hello shell"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $name
hello shell
ubuntu@VM-24-12-ubuntu:~/20221212$ echo ${name}
hello shell

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

ubuntu@VM-24-12-ubuntu:~/20221212$ name="kobe"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "$nameplaying~~~"
~~~
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "${name}playing~~~"
kobeplaying~~~

3、删除命令

unset 变量名

ubuntu@VM-24-12-ubuntu:~/20221212$ a="jm"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a
jm
ubuntu@VM-24-12-ubuntu:~/20221212$ unset a
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a

4、变量的作用域

4.1、局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

4.2、全局变量

在当前shell中任何地方可以使用的变量,并且,还可以在子shell进程中有效的变量,称为全局变量

4.3、环境变量

所有的程序,包括shell启动的程序,都能访问环境变量;
在路径为/etc/profile的文件中编辑的任意变量都是系统环境变量
在路径为~/.bashrc的文件中编辑的任意变量都是用户环境变量
显示当前Shell中所有变量printenv

5、自定义变量

ubuntu@VM-24-12-ubuntu:~$ export TEST=66
ubuntu@VM-24-12-ubuntu:~$ echo $TEST
66

6、只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

ubuntu@VM-24-12-ubuntu:~$ name="kobe"
ubuntu@VM-24-12-ubuntu:~$ readonly name
ubuntu@VM-24-12-ubuntu:~$ unset name
bash: unset: name: cannot unset: readonly variable

二、字符串

1、单引号

变量名=‘变量值’
特点:变量值是什么输出就是什么

ubuntu@VM-24-12-ubuntu:~$ a="today"
ubuntu@VM-24-12-ubuntu:~$ b='$a studing~~'
ubuntu@VM-24-12-ubuntu:~$ echo $b
$a studing~~

2、双引号(用的多)

变量名=“变量值”

ubuntu@VM-24-12-ubuntu:~$ a="today"
ubuntu@VM-24-12-ubuntu:~$ c="$a studing~~"
ubuntu@VM-24-12-ubuntu:~$ echo $c
today studing~~

3、拼接字符串

ubuntu@VM-24-12-ubuntu:~$ a="hello"
ubuntu@VM-24-12-ubuntu:~$ b="$a china"
ubuntu@VM-24-12-ubuntu:~$ echo $b
hello china

4、获取字符串的长度

ubuntu@VM-24-12-ubuntu:~$ a="hello"
ubuntu@VM-24-12-ubuntu:~$ echo ${#a}
5

5、提取子字符串

ubuntu@VM-24-12-ubuntu:~$ a="runoob is a great site"
ubuntu@VM-24-12-ubuntu:~$ echo ${a:1:4}
unoo

三、shell数组

1、定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 … 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

注意:数组采用小括号,值与值之间使用空格隔开

还可以单独定义数组的各个分量
数组[0]=value0
数组[1]=value1

2、读取数组

ubuntu@VM-24-12-ubuntu:~$ echo ${array[0]}
0
ubuntu@VM-24-12-ubuntu:~$ echo ${array[1]}
2
ubuntu@VM-24-12-ubuntu:~$ echo ${array[-1]}
5

3、获取数组的长度

ubuntu@VM-24-12-ubuntu:~$ echo ${#array[*]}
5

四、Shell 注释

1、单行注释

以 # 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,

2、多行注释

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

五、传递参数(特殊变量)

脚本中命令如下:

#!/bin/bash
echo "shell脚本中传递参数:"
echo "脚本名称:$0"
echo "传递的第一个参数:$1"
echo "传递的第二个参数:$2"
echo "传递的参数个数:$#"
echo "传递的参数有:$@"
echo "传递的参数有:$*"                       

执行脚本

ubuntu@VM-24-12-ubuntu:~/20221212$ bash test1.sh "value1" "value2"
shell脚本中传递参数:
脚本名称:test1.sh
传递的第一个参数:value1
传递的第二个参数:value2
传递的参数个数:2
传递的参数有:value1 value2
传递的参数有:value1 value2

$0:代表该脚本名称
$1 - $9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#:获取当前shell命令行中参数的总个数
$?:获取执行上一个命令的返回值(0:代表成功,非0代表失败)
$*:功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

$* 与 $@ 区别:

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。
假设在脚本运行时写了三个参数 1、2、3,
则 " * " 等价于 “1 2 3”(传递了一个参数),
而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

六、基本运算符

算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符

1、算数运算符

ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a+$b]
14

或者:

ubuntu@VM-24-12-ubuntu:~/20221212$ expr $a + $b
14

ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a - $b]
-2

ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a * $b]
48

ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a / $b]
0

等于、不等于

ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a == $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a != $b ];echo $?
0

2、关系运算符

-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

注意:[ 表达式 ] ,表达式与中括号之间一定要有空格

ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a
6
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $b
8
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -eq $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -ne $b ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -gt $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -ge $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -le $b ];echo $?
0

3、布尔运算符

! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

a=6
b=8
c=0

ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b -o $a -gt $c ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b -a $a -gt $c ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -nt $b -a $a -gt $c ];echo $?
1

4、逻辑运算符

&&: 表示前一条命令执行成功时,才执行后一条命令;
|| :表示上一条命令执行失败后,才执行下一条命令

ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -gt $b ] && echo "成功" ||  echo "失败"
失败
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b ] && echo "成功" ||  echo "失败"
成功

5、字符串运算符

= 检测两个字符串是否相等,相等返回 true
!= 检测两个字符串是否不相等,不相等返回 true
-z 检测字符串长度是否为0,为0返回 true
-n 检测字符串长度是否不为 0,不为 0 返回 true
$ 检测字符串是否不为空,不为空返回 true

ubuntu@VM-24-12-ubuntu:~/20221212$ [ $str1 = $str2 ]; echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $str1 != $str2 ]; echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -z str1 ]; echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -n str1 ]; echo $?
0

6、文件测试运算符

-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。

ubuntu@VM-24-12-ubuntu:~/20221212$ [ -d ~/20221212/test1.sh ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -f ~/20221212/test1.sh ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -e ~/20221212/test1.sh ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -e ~/20221212/test2.sh ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -x ~/20221212/test1.sh ];echo $?
1

七、echo命令

用于字符串的输出。命令格式:

echo string

1、显示普通字符串

echo “It is a test”

2、显示换行

ubuntu@VM-24-12-ubuntu:~/20221212$ echo -e "OK! \nOK!"
OK! 
OK!

3、显示不换行

#!/bin/bash
echo -e "OK! \c"
echo "It is a test"
ubuntu@VM-24-12-ubuntu:~/20221212$ bash test2.sh 
OK! It is a test

4、显示结果定向至文件

ubuntu@VM-24-12-ubuntu:~/20221212$ echo "It is a test" > myfile

5、显示命令执行结果

echo `date`
Tue 13 Dec 2022 03:02:27 PM CST

八、if语句

1、if语句语法格式:

if condition
then
	command1
	command2
	command3
fi

2、if—else语句语法格式:

if condition
then
	command1
	command2
else
	command3
fi

3、if—elif—else 语法格式:

if condition
then
	command1
	command2
elif condition1
then	
	command3
	command4
else
	command5
fi

4、案例

#!/bin/bash
read -p "请输入数字a:" a
read -p "请输入数字b:" b

if [ $a -gt $b ]
then
        echo "$a大于$b"
elif [ $a -lt $b ]
then
        echo "$a小于$b"
else
        echo "$a等于$b"
fi
、
ubuntu@VM-24-12-ubuntu:~/20221212$ bash if.sh
请输入数字a:6
请输入数字b:6
6等于6
ubuntu@VM-24-12-ubuntu:~/20221212$ bash if.sh
请输入数字a:4
请输入数字b:7
4小于7
ubuntu@VM-24-12-ubuntu:~/20221212$ vim if.sh

九、for循环

1、语句格式:

for var in item1 item2 ... itemn
do
	command1
	command2
	...
done

2、案例:顺序输出当前列表中的数字

#!/bin/bash
for loop in 1 2 3 4 5
do
        echo "value:$loop"
done          
ubuntu@VM-24-12-ubuntu:~/20221212$ bash for.sh 
value:1
value:2
value:3
value:4
value:5

3、案例:顺序输出字符串中的字符

for loop in this is a string
do
        echo "value:$loop"
done
ubuntu@VM-24-12-ubuntu:~/20221212$ bash for.sh 
value:this
value:is
value:a
value:string

十、while循环

1、语法格式为:

while condition
do
	command
done

2、案例:输入一个数,计算1到这个数的和

#!/bin/bash
s=0
i=1
read -p "请输入数字:" num
while [ $i -le $num ]
do
        s=$[$s+$i]
        i=$[$i+1]
done
echo $s
ubuntu@VM-24-12-ubuntu:~/20221212$ bash while.sh 
请输入数字:100
5050

3、无限循环格式

while true
do
	command
done

十一、case语句

case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

1、语法格式

casein
模式1)
	command1
	command2
	...
	;;
模式2)
	command1
	command2
	...
	;;
esac

2、案例

#!/bin/bash
echo "请输入数字:"
read num
case $num in
        1)
                echo "你选择了1"
                ;;
        2)
                echo "你选择了2"
                ;;
        3)
                echo "你选择了3"
                ;;
        4)
                echo "你选择了4"
                ;;
        *)
                echo "输入错误"
                ;;
esac
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh 
请输入数字:
12
输入错误
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh 
请输入数字:
5^H
输入错误
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh 
请输入数字:
1
你选择了1

3、跳出循环:break

#!/bin/bash
while :
do
        echo -n "请输入1-5之间的数字:"
        read number
        case $number in
                1|2|3|4|5)
                        echo "你输入的数字为$number"
                        ;;
                *)
                        echo "你输入的数字不是1-5之间的数字"
                        break
                        ;;
        esac
done        
ubuntu@VM-24-12-ubuntu:~/20221212$ bash break.sh 
请输入1-5之间的数字:2
你输入的数字为2
请输入1-5之间的数字:7
你输入的数字不是1-5之间的数字
ubuntu@VM-24-12-ubuntu:~/20221212$ 

在这里插入图片描述

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

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

相关文章

必须掌握的数据库面试问题

一、为什么用自增列作为主键 1、如果我们定义了主键(PRIMARY KEY)&#xff0c;那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键&#xff0c;则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引&#xff0c;则InnoDB会选择内置…

1990-2021年全国各省产业高级化 数据

1990-2021年全国各省产业高级化数据 1、来源为&#xff1a;统计NJ、各省NJ 2、包括&#xff1a;全国31个省份 3、时间&#xff1a;1990-2021年 4、指标包括&#xff1a; 各地区经纬度、第三产业增加值、第二产业增加值、高级化水平 高级化水平第三产业增加值(亿元) / 第二…

HTTP协议【报文格式】

文章目录HTTP协议什么是HTTP协议HTTP协议格式抓包工具的使用HTTP请求URLURL的组成URL encodeHTTP请求的报文格式HTTP响应的报文格式HTTP方法GET方法POST方法POST方法与GET方法的区别请求报头HTTP响应状态码状态码的组成状态码的类别HTTP协议 什么是HTTP协议 HTTP协议即Hyper T…

m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 假设有M个用户均为MIMO Full Duplex&#xff0c;N个频率&#xff0c;1<N<M&#xff0c;设计算法实现M个用户与N个频率的匹配。 由于在一个MIMO系统中&#xff0c;用户数量M大于可用的频谱个…

web自动化测试入门篇04——selenium+python基础方法封装

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

记录一次解决centos不定时触发oom的经历

前言 前一段时间&#xff0c;业务部门的系统不定时的反馈&#xff0c;系统打开不了&#xff0c;提示&#xff1a; 等技术开发同学反应过来去查看业务状态时&#xff0c;服务又恢复了&#xff0c;由于不是核心的业务&#xff0c;并且出问题差不多1分钟左右&#xff0c;没太在意…

【Vue 快速入门系列】todoList案例小总结

文章目录一、案例效果二、项目介绍三、版本更新迭代末、项目素材1.css样式2.html一、案例效果 如下图所示&#xff0c;制作一个这样的记事本&#xff0c;可以使用这个记事本进行数据的存储以及管理&#xff0c;样式是天禹老师写好的我们直接使用就好了&#xff0c;主要在这个小…

[UE][UE5]零基础学习-学习记录1-UE5安装与基本使用方法

[UE5]学习1-UE5安装与基本使用方法写在前面01.作者碎碎念2.UE5安装方法01.UE5需要的电脑配置02.UE5安装方法001.Epic下载002.下载安装UE503.基本使用方法001.创建项目打开现有的项目&#xff1a;002.文件目录结构003.用户界面介绍1).3D画面视窗2).菜单栏3).内容浏览器4).属性面…

关于CM3/CM4位带操作的总结

1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间&#xff08;都是最低1MB&#xff09;是位带区域&#xff0c;跟这个区域相对应的有一段位带别名区域&#xff0c;位带别名区的大小是位带区的32倍&#xff0c;位带别名区的每一个地址都对应位带区域的一个…

C. Hamiltonian Wall edu139 div2

Problem - C - Codeforces 题意是给你一个2*n的网格&#xff0c;让你一笔把所有的B涂满&#xff0c;并且只能涂一次&#xff0c;问你是否可行 分析&#xff1a; 其实分析的时候我想到了转移。每一次的结果是由上一次转移而来&#xff0c;所以如果前后矛盾的话&#xff0c;即…

人工智能:智能语音技术应用场景介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案

虹科2022年度SWCF卫星通信与仿真测试研讨会正在进行中。昨日精彩演讲&#xff1a;C波段卫星与5G之间的干扰排查及解决方案&#xff0c;感谢大家的观看与支持&#xff01; 昨晚的直播间收到一些粉丝的技术问题&#xff0c;虹小科汇总了热点问题并请讲师详细解答&#xff0c;在此…

目前UI设计薪资待遇怎么样?工作好找吗?

UI设计的火爆&#xff0c;导致有很多年轻人都愿意投身于这个行业。有很多年轻的朋友都在问&#xff0c;UI设计的薪资待遇怎么样&#xff1f;工作难找吗&#xff1f;本文统一解答一下。 1、UI设计的薪资水平 UI设计的薪资待遇一直很好&#xff0c;学习UI设计之前没有任何相关基础…

PMP每日一练 | 考试不迷路-12.13(包含敏捷+多选)

被延期考试的宝子 一定要坚持刷题 每日5道PMP习题助大家上岸PMP&#xff01; ​题目1-2&#xff1a; ​1.一位主要相关方要求将每日站立会议的持续时间人15分钟增加到1小时。Scrum主管应该做什么? ( ) A.接受建议并建议团队更改会议时间表 B.安排与产品负责人和团队开…

窗口销毁消息 WM_DESTROY 的正确处理方式

上次&#xff0c;我提到了可能导致正常的消息循环被破坏的怪异之处。 有一位读者 Adrian 指出&#xff0c;WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸&#xff0c;但&#xff08;无论是否错误&#xff09;十多年来一直如此&#xff0c;现在修改它会…

【实时数仓】实现用户行为日志相关功能(源码)

文章目录一 准备用户行为日志-DWD层1 代码实现&#xff08;1&#xff09;识别新老访客&#xff08;2&#xff09;利用侧输出流实现数据拆分&#xff08;3&#xff09;将不同流的数据推送到下游kafka的不同Topic&#xff08;分流&#xff09;a 封装方法b 程序中调用kafka工具类获…

数据链路层

文章目录数据链路层的功能ARP协议DNS-------域名解析&#xff08;浅浅的了解一下&#xff09;在浏览器中输入URL后&#xff0c;发生的事情&#xff08;经典面试题&#xff09;ICMP协议NAT技术代理服务器网络核心知识大总结数据链路层的功能 对比理解网络层。 网络层 &#xff…

飞控学习随记

常见指令 编译Arduplane程序 cd ardupilot/ ./waf plane 进入 Tools/autotest 文件夹中&#xff0c;启动3D flightgear ./fg_quad_view.sh 进入ArduPLane文件夹中&#xff0c;启动仿真 sim_vehicle.py --map --console -L KSFO&#xff08;-L 选择起飞位置&#xff09; 解锁…

字节女测试工程师万字总结的软件测试入门技巧

成为一个优秀的测试工程师需要具备哪些知识和经验&#xff1f; 针对这个问题&#xff0c;可以直接拆分以下三个小问题来详细说明&#xff1a; 1、优秀软件测试工程师的标准是什么&#xff1f; 2、一个合格的测试工程师需要具备哪些专业知识&#xff1f; 3、一个合格的测试工程…

前端vue项目部署到生产环境(包括nginx安装及配置)

一.vue3项目打包 vue3项目 使用vue-cli创建的&#xff0c;使用npm run build打包到dist 二.在服务器上安装nginx 1.去nginx的官网下载windows版本的nginx&#xff0c;下载地址&#xff1a;nginx: download 最好安装稳定版&#xff0c;下载完成后解压nginx压缩包&#xff1a…