【Bash/Shell】知识总结
文章目录
- 1. 总体认识
- 1.1. Shell概述
- 1.2. 第一个Shell脚本
- 1.3. 注释
- 2. 变量
- 2.1. 定义变量
- 2.2. 使用变量
- 2.3. 只读变量
- 2.4. 删除变量
- 2.5. 变量类型
- 2.5.1. 字符串变量
- 2.5.2. 整数变量
- 2.5.3. 数组变量
- 2.5.4. 环境变量
- 2.5.5. 特殊变量
- 3. 输出
- 3.1. echo命令
- 3.2. printf命令
- 4. 运算符
- 4.1. 运算表达式
- 4.2. 条件表达式
- 4.2.1. 关系运算符
- 4.2.2. 逻辑运算符
- 4.2.3. 字符串运算符
- 4.2.4. 文件测试运算符
- 5. 流程控制
- 5.1. 条件语句
- 5.1.1. if语句
- 5.1.2. case多选择语句
- 5.2. 循环语句
- 5.2.1. for循环
- 5.2.2. while循环
- 5.2.3. 无限循环
- 5.2.4. until循环
- 5.2.5. 跳出循环
- 6. 函数
- 7. 输入输出重定向
- 8. 文件包含
- 9. 常用shell命令
- 9.1. alias
1. 总体认识
1.1. Shell概述
- Shell是一个用C语言编写的程序,这个程序提供了一个界面,用户通过这个界面可以访问操作系统内核的服务。
- Shell既是一种命令语言,又是一种解释型的程序设计语言。
- Shell脚本(shell script),是一种为shell编写的脚本程序。
- Shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
- Linux的Shell种类众多,常用的有Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)等等,其中Bourne Again Shell是Bourne Shell的增强版本,兼容性更好,且提供了更多的特性和功能。由于易用和免费,Bash是大多数Linux系统默认的Shell。
1.2. 第一个Shell脚本
- 文件名:test.sh
#!/bin/bash echo "Hello World!"- shell脚本名:
*.sh。 - 第一行使用
#!指定解释器路径。 - 第二行
echo语句的作用是在终端显示指定内容。
- shell脚本名:
- 运行Shell脚本
- 作为可执行程序
chmod +x ./test.sh # 使脚本具有执行权限 ./test.sh # 执行脚本- 作为解释器参数
bash test.sh
1.3. 注释
- 单行注释:以
#开头的行会被解释器忽略。 - 多行注释
:<<EOF
Here文档中的内容不会被执行
EOF: << delimiterdocument
delimiter:'
冒号代表空命令,后面的内容不会执行
'
2. 变量
变量是存储的数据值的名称。
2.1. 定义变量
variable=value
- 注意:变量名和等号之间不能有空格。
- 变量命名要求:
- 只由字母、数字和下划线组成,不能以数字开头。
- 避免使用Shell关键字。
- 习惯上,常量的变量名通常使用大写字母
2.2. 使用变量
variable=value
echo $variable
echo ${variable}
- 变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。
- 已定义的变量,可以被重新定义。
variable=value1 echo $variable variable=value2 echo $variable
2.3. 只读变量
variable=value
readonly variable
2.4. 删除变量
variable=value
unset variable
- 变量被删除后不能再次使用。
- unset 命令不能删除只读变量。
2.5. 变量类型
2.5.1. 字符串变量
str1=hello
str2='hello'
str3="hello"
- 变量通常被视为字符串。
- 可以使用单引号 ’ 或双引号 " 来定义字符串
- 单引号字符串的限制
- 单引号字符串里的任何字符都会原样输出,不能进行变量值的替换。
- 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号字符串
name="world" str="\"Hello,$name! \"\n" echo -e $str- 双引号字符串中可以进行值的替换。
- 双引号字符串中可以出现转义字符。
- 使用echo语句显示
\n要添加参数-e。
- 拼接字符串
name="world"# 使用双引号
str1="hello, "$name"!"
str2="hello, $name!" # 推荐# 使用单引号
str3='hello, '$name'!'
- 获取字符串的长度
str="hello"
echo ${#str}
echo ${#str[0]}
- 提取子字符串
str="Hello, World!"
echo ${str:1:4} # 输出ello
- 查找子字符串
str="Hello, World"# 获得字符l,o第1次出现时,已经读取的字符串部分
x=${str%%[lo]*} # x的值为He
# x的长度加1即为首次出现指定字符的索引
echo $((${#x}+1)) # 输出3
2.5.2. 整数变量
declare -i intvar=3
typeset -i intvar=3
这样的声明告诉Shell将intvar视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。
2.5.3. 数组变量
- 数组变量可以在一个变量中存储多个值。
- 整数索引数组
array1=(1 2 3 4 5) array2=("1"2"hello" ) array3[0]=value0 array3[2]=value2- 可以不使用连续的下标,而且下标的范围没有限制。
- 索引数组元素:
${数组名[索引]} - 获取所有元素:
${数组名[*]}或${数组名[@]},两者的区别是后者常用于迭代。 - 获取数组的长度:
${#数组名[*]}或${#数组名[@]} - 获取数组单个元素的长度:
${#数组名[索引]}
- 关联数组
declare -A asarray asarray["name"]="John" asarray["age"]=30declare -A site=(["google"]="www.google.com"["baidu"]="www.baidu.com" )- 键可以是任意的字符串或者整数
- 键是唯一的
- 使用键访问关联数组元素:
数组名[键] - 获得所有值:
${数组名[*]}或${数组名[@]},两者的区别是后者常用于迭代。 - 获得所有键:
${!数组名[*]}或${!数组名[@]},两者的区别是后者常用于迭代。 - 获得数组长度:
${#数组名[*]}或${#数组名[@]}
2.5.4. 环境变量
- 环境变量是由操作系统或用户设置的特殊变量,用于配置Shell的行为和影响其执行环境。
- PATH变量包含了操作系统搜索可执行文件的路径
- 将路径添加PATH
export PATH=${your_path}:$PATH- 直接在终端执行是临时设置
- 要永久设置则须写入配置文件
- 当前登陆用户配置文件:
~/.bashrc - 所有用户的配置文件:
/etc/profile - 写入后要重新加载:
source ${config_path}
- 当前登陆用户配置文件:
- 添加其他环境变量与PATH变量类似
2.5.5. 特殊变量
| 特殊变量 | 作用 |
|---|---|
$0 | 脚本名称 |
$1, $2, … | 脚本参数 |
$# | 传递给脚本的参数数量 |
$* | 以一个单字符串接收所有向脚本传递的参数 |
$@ | 以"$1" “ 2 " … " 2" … " 2"…"n” 的形式接收所有参数,常用于迭代 |
$? | 上一个命令的退出状态,0表示没有错误,其他任何值表明有错误。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
3. 输出
3.1. echo命令
- 命令格式
echo string
- 显示普通字符串
echo "It is a test"
echo It is a test
- 显示转义字符
echo "\"It is a test\""
echo \"It is a test\"
- 显示变量
# 标准输入中读取一行(不允许转义)到变量name
read -r name
echo "$name is good!"
- 显示换行
echo -e "OK! \n" # -e 开启转义
echo "******"
- 显示不换行
echo "OK! \n" # 原样输出\n
echo "******"
echo -e "OK! \c" # -e 开启转义,但不换行
echo "******"
- 原样输出字符串
echo '$name\"'
- 显示命令执行结果
echo "Date: $(date)"
3.2. printf命令
printf命令模仿C程序库里的printf()函数。- 命令格式
printf format-string [arguments...]
- 格式化字符串参照C语言
- 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,
format-string被重用 - 如果没有
arguments,那么%s用NULL代替,%d用0代替 - 格式化字符串中的
%b格式- 用于参数中存在
\n时,输出换行。用%s会原样输出\n。 - 仅在
%b格式下,\c可以抑制(不显示)输出结果中任何结尾的换行字符,而且其后的所有内容全部忽略。用%s会原样输出\c。
- 用于参数中存在
4. 运算符
4.1. 运算表达式
- 运算表达式的使用
val=$((2 + 2)) echo "$val"$((...))中不用考虑空格的问题,变量不用加$号。- 支持的运算
运算符 含义 举例 +加法 $((a + b))-减法 $((a - b))*乘法 $((a * b))/除法 $((a / b))%取余 $((a % b))++自增,与C++相同 $((a++))--自减,与C++相同 $((a--))=赋值,右值作为结果 $((a = b))==比较相等,相等为1,否则为0 $((a - b))!=比较不相等,不相等为1,否则为0 $((a - b))>比较大于,大于为1,否则为0 $((a - b))<比较小于,小于为1,否则为0 $((a - b))>=比较大于等于,大于等于为1,否则为0 $((a - b))<=比较小于等于,小于等于为1,否则为0 $((a - b))
4.2. 条件表达式
- 条件表达式的使用
a=2 b=1if test $a -eq $b thenecho "相等" elif [ $a -ge $b ] thenecho "大于" elif (($a < $b))echo "小于" elseecho "错误" fi- 条件表达式通常用于流程控制中
- 条件判断可以使用
test 条件表达式 - 条件判断可以使用
[ 条件表达式 ],注意要有空格 - 条件判断可以使用
((条件表达式)),此时可以不用考虑空格
4.2.1. 关系运算符
只支持数字,不支持字符串。
| 运算符 | 含义 | 举例 |
|---|---|---|
-eq | 检测两个数是否相等,相等返true。 | [ $a -eq $b ] |
-ne | 检测两个数是否不相等,不相等返回true。 | [ $a -ne $b ] |
-gt | 检测两个数是否大于右边的,如果是,则返回true。 | [ $a -gt$b ] |
-lt | 检测两个数是否小于右边的,如果是,则返回true。 | [ $a -lt $b ] |
-ge | 检测两个数是否大于等于右边的,如果是,则返回true。 | [ $a -ge $b ] |
-le | 检测两个数是否小于等于右边的,如果是,则返回true。 | [ $a -le $b ] |
4.2.2. 逻辑运算符
优先级:! > && > ||,存在短路运算。
| 运算符 | 含义 | 举例 |
|---|---|---|
&& | 逻辑与运算 | [[ $a -lt 100 && $b -gt 15 ]] |
|| | 逻辑或运算 | [[ $a -lt 100 || $b -gt 15 ]] |
! | 逻辑非运算 | [[ ! $a -lt 100 ]] |
4.2.3. 字符串运算符
| 运算符 | 含义 | 举例 |
|---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] |
-n | 检测字符串长度是否不为0,不为0返回 true。 | [ -n $a ] |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] |
4.2.4. 文件测试运算符
用于检测Unix文件的各种属性。
| 运算符 | 含义 | 举例 |
|---|---|---|
-b | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] |
-c | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] |
-d | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] |
-f | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] |
-g | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] |
-k | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] |
-p | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] |
-u | 检测文件是否设置了SUID位,如果是,则返回 true。 | [ -u $file ] |
-r | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] |
-w | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] |
-x | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] |
-s | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] |
-e | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] |
-S | 判断某文件是否 socket。 | [ -S $file ] |
-L | 检测文件是否存在并且是一个符号链接。 | [ -L $file ] |
5. 流程控制
5.1. 条件语句
5.1.1. if语句
- 最展开的格式
if 条件判断
then命令1命令2...
elif 条件判断
then命令1命令2...
else命令1命令2...
fi
- 写成一行要加分号分隔
if 条件判断; then 命令; fi
if 条件判断; then命令1命令2...
fi
5.1.2. case多选择语句
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;*)command1command2...commandN;;
esac
5.2. 循环语句
5.2.1. for循环
- 最展开的格式
for var in item1 item2
do命令1命令2...
done
- 写成一行要加分号分隔
for var in item1 item2; do 命令1; 命令2; done
5.2.2. while循环
- 一般格式
while 条件判断
do命令1命令2...
done
- 循环读取键盘输入
while read -r site
doecho "是的!$site 是一个好网站"
done
5.2.3. 无限循环
while true
do命令
done
5.2.4. until循环
先执行,再判断
until 条件判断
do命令
done
5.2.5. 跳出循环
break是跳出本级循环continue跳出本次循环
6. 函数
- 格式
function funname [()]
{action[return int;]
}[ function ] funname ()
{action[return int;]
}
- 所有函数在使用前必须定义。
- 调用函数仅使用其函数名即可。
- 返回值
- 如果不return语句,将以最后一条命令运行结果作为返回值。
- 只能返回0-255。
- 函数返回值在调用该函数后通过
$?来获得。
- 函数参数与脚本的命令行参数相同
7. 输入输出重定向
- 文件描述符
- 0表示标准输入(STDIN)
- 1表示标准输出(STDOUT)
- 2表示标准错误输出(STDERR)
- 空设备文件nul(指向/dev/null)
- 输出重定向到文件,覆盖原文件。
command > file - 输出以追加的方式重定向到文件
command >> file - 合并标准输出和标准错误输出,并重定向到文件
command > file 2>&1 - 错误输出重定向到文件
command 2> file - 将输入重定向为文件
command < file - Here文档:将输入重定向为两个分隔符之间的内容
command << delimiterdocument delimiter - 对标准输入和标准输出都进行重定向
command < file1 > file2 - 屏蔽命令输出
command > nul command > /dev/null
8. 文件包含
. filename # 注意有空格
source filename
上述语句会先执行指定shell脚本,但是保留shell脚本执行结束会清理的变量等内容
9. 常用shell命令
9.1. alias
- 用于设置指令的别名
- 语法
alias [别名]="[指令名称]"
- 注意多条指令用分号分隔
相关文章:
【Bash/Shell】知识总结
文章目录 1. 总体认识1.1. Shell概述1.2. 第一个Shell脚本1.3. 注释 2. 变量2.1. 定义变量2.2. 使用变量2.3. 只读变量2.4. 删除变量2.5. 变量类型2.5.1. 字符串变量2.5.2. 整数变量2.5.3. 数组变量2.5.4. 环境变量2.5.5. 特殊变量 3. 输出3.1. echo命令3.2. printf命令 4. 运算…...
单例模式(C++实现)
RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别 线程安全与STL与其他锁...
ElasticSearch 聚合统计
聚合统计 度量聚合:求字段的平均值,最小值,最大值,总和等 桶聚合:将文档分成不同的桶,桶的划分可以根据字段的值,范围,日期间隔 管道聚合:在桶聚合的结果上执行进一步计…...
SpringIOC之MethodBasedEvaluationContext
博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...
【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手
前言 TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。在建立 TCP 连接时,需要进行三次握手,防止因为网络延迟、拥塞等原因导致的数据丢失或错误传输,确保双方都能够正常通信。 TCP三次握手在Wireshark数据包中…...
钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024发酵展
钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024济南生物发酵展! 展位号:2号馆A65展位 2024第12届国际生物发酵产品与技术装备展览会(济南)于3月5-7日在山东国际会展中心盛大召开,展会同期将举办30余场高质…...
Python模拟动态星空
前言 今天,我们来用Python做个星空。 一、模拟星空 1,.首先导入所需要的库: from turtle import * from random import random, randint 2.初始画面: screen Screen() width, height 800, 600 screen.setup(width, height) screen.tit…...
最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)
最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)。 什么是推流? 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源…...
shell ——数组
数组中可以存放多个值,Bash Shell只能支持以为数字,初始化时不需要定义数组大小。 数组中元素下标从0开始。 数组的定义 shell数组用括号来表示,元素用空格分割开。 array_name(value1 value2 value3 ...) 给一个简单数组例子 cat firs…...
GO语言基础笔记(五):包的介绍
在Go语言中,包(package)是代码组织和重用的基本单位。Go的标准库中包含了许多实用的包,它们提供了从基础数据处理到复杂网络编程等各种功能。下面是一些常用的Go标准库包及其作用的介绍: 目录 1. fmt 2. net/http …...
【Unity6.0+AI】Sentis加载模型识别手写数字案例实现
按照国际惯例,看效果: 素材准备: 自己在PS中绘制黑底白字手写字体,导出jpg,尺寸28*28! 素材设置 基本步骤 准备工作:从 ONNX Model Zoo 下载手写识别 ONNX 模型文件 【下载模型】MNIST 手写数字识别模型 mnist-12.onnx,并将其拖入项目窗口的 Assets 文件夹。 【下载模…...
VScode跑通Remix.js官方的contact程序开发过程
目录 1 引言 2 安装并跑起来 3 设置根路由 4 用links来添加风格资源 5 联系人路由的UI 6 添加联系人的UI组件 7 嵌套路由和出口 8 类型推理 9 Loader里的URL参数 10 验证参数并抛出响应 书接上回,我们已经跑通了remix的quick start项目,接下…...
讲座思考 | 周志华教授:新型机器学习神经元模型的探索
12月22日,有幸听了南京大学周志华教授题为“新型机器学习神经元模型的探索”的讲座。现场热闹非凡,大家像追星一样拿着“西瓜书”找周教授签名。周教授讲得依旧循循善诱,由浅入深,听得我很入迷,故作此记。 周教授首先就…...
docker构建镜像及项目部署
文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件,完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…...
ARM串口通信编程实验
完成:从终端输入选项,完成点灯关灯,打开风扇关闭风扇等操作 #include "gpio.h" int main() {char a;//char buf[128];uart4_config();gpio_config();while(1){//接收一个字符数据a getchar();//发送接收的字符putchar(a);switch(…...
MyBatis的延迟加载(懒加载)
MyBatis 中的延迟加载是指在需要时才加载对象的某些属性或关联对象,而不是在初始查询时就加载所有数据。这对于性能优化和减少不必要的数据库查询非常有用。 1. 基于配置文件的延迟加载 在 MyBatis 的 XML 映射文件中,你可以使用 lazyLoadingEnabled 和…...
嵌入式-stm32-用PWM点亮LED实现呼吸灯
一:知识前置 1.1、LED灯怎么才能亮? 答:LED需要低电平才能亮,高电平是灯灭。 1.2、LED灯为什么可以越来越亮,越来越暗? 答:这是用到不同占空比来实现的,控制LED实现呼吸灯&…...
C语言初学7:循环
while 循环 一、while 循环语法: while(condition) {statement(s); } condition 为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。 二、while 循环举例 #inc…...
力扣69. x 的平方根
二分查找 思路: 设置 left 指针为 0,right 指针为 x;如果 mid (right - left) / 2 left 的平方小于或等于 x,此时移动 left mid 1,并缓存当前 mid 值,可能这个 mid 就是结果,或者 x 的平方…...
go语言学习计划。
第1周:Go语言概述与环境搭建 内容:了解Go语言的历史、特点和应用场景。安装Go环境,配置工作区。实践:编写第一个Go程序,了解Go的编译运行流程。 第2周:基本语法与数据类型 内容:学习基本数据…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
