AWS基础知识点
2026-02-10 12:32:13 0 举报
AI智能生成
亚马逊网络服务(AWS)是全球领先和多样化的云服务提供商,它提供了全套的云服务,涵盖了计算,存储,数据库,网络和应用程序等关键层面,助企业降低成本,提高效率,加速创新。这些服务种类繁多,包括了弹性计算云(EC2)提供灵活的可调整计算能力,简单存储服务(S3)为各种规模的数据提供高可靠和扩展的存储选项,而关系型数据库服务(RDS)则简化了传统数据库的管理,提供处理数据的强大能力。AWS的核心价值还在于其全球基础设施布局,数百个技术亮点散布在世界各地,确保了全球范围内极佳的网络连接速度和服务的可访问性。此外,AWS 拥有先进的安全性和合规性认证,保障数据安全和业务连续性。无论你是创业型企业还是全球500强企业,AWS都能为企业提供量身定做的解决方案,帮助企业紧跟技术的步伐,实现持续性成长。
作者其他创作
大纲/内容
VPC
私有IP地址范围
10.0.0.0(大型企业)
172.16.0.0(中型企业)
192.168.0.0(家庭/小型网络)
CIDR与子网
权重位值法(8位分别对应)<br>128 64 32 16 8 4 2 1
<br>
子网规划
公有子网(Public subnet)
连接IGW
私有子网(Private subnet)
通过NAT Gateway访问互联网
网关(Gateway)
IGW (Internet Gateway)
公有子网
NAT Gateway
公有子网
私有子网
弹性IP(EIP)
路由表(Route Table)
local 路由
公有路由表(Public Route Table)
路由(Route)
目的地(Destination)
如 0.0.0.0/0 代表全互联网
流量出口目标(Target)
选择已创建并附加到 VPC 的 Internet Gateway (IGW)
子网关联
必须手动将需要公网访问能力的公有子网(如 Pub Subnet 1a 和 1c)关联到此路由表
关联公有子网的目的是使其具备通过 Internet Gateway (IGW) 访问互联网的能力。<br>• 定位路由表:在 VPC 控制台的“路由表 (Route Tables)”页面中,选中已配置好 IGW 路由的公有路由表(例如 dp-public-rt)。<br>• 进入关联界面:点击下方的**“子网关联 (Subnet Associations)”选项卡,然后点击“编辑子网关联 (Edit subnet associations)”**。<br>• 勾选子网:在列表中勾选需要具备公网权限的子网。在实战练习中,通常勾选两个绿色标识的公有子网:Pub Subnet 1a (192.168.0.0/20) 和 Pub Subnet 1c (192.168.16.0/20)。<br>• 保存设置:保存后,这些子网内的实例即可通过 IGW 访问互联网
私有路由表(Private Route Table)
路由(Route)
目的地(Destination)
0.0.0.0/0
流量出口目标(Target)
指向本可用区内的 NAT Gateway
子网关联
将对应的私有子网(如 Pvt Subnet 1a)关联到此表
私有子网通常需要关联到指向 NAT Gateway 的独立路由表,以实现安全出站。<br>• 按可用区分开关联:<br> ◦ 针对 AZ 1a:选中 AZ 1a 的私有路由表(如 dp-private-rt-1a),在“子网关联”中选择关联 AZ 1a 的私有子网(如 Pvt Subnet 1a:192.168.32.0/20)。<br> ◦ 针对 AZ 1c:选中 AZ 1c 的私有路由表(如 dp-private-rt-1c),在“子网关联”中选择关联 AZ 1c 的私有子网(如 Pvt Subnet 1c:192.168.48.0/20)。<br>• 保存设置:关联完成后,私有子网内的实例将通过对应 AZ 的 NAT Gateway 访问互联网。<br>
VPC Peering 对等连接
两个 VPC 之间的网络连接。<br>通过此连接可以不经过互联网在这两个 VPC 之间路由流量。这两个 VPC 中的实例可以彼此通信,就像它们在同一私有网络中一样。<br>可以在同一 AWS 账户的 VPC 之间、其他账户中的 VPC 或与其他 Region 中的 VPC 之间创建 VPC 对等连接。<br><br>注意点:<br>创建对等连接之后,需要更新打算使用它进行 VPC 间通信的子网的路由表。两个连接起来的 VPC,Cidr 块不能有重叠。
EC2
Bastion Server
通过拥有公有子网的跳板机传送密钥,给到私有IP的实例从而连接私有Server
系统镜像(AMI)
<br>
Auto Scaling Group 自动扩缩组
Scal out 横向扩张
Scal in 横向缩减
Scal up 纵向扩张
Scal down 纵向缩减
Launch Templates 启动模板
可以多选subnet,如果选了多个subnet则会给这些subnet平均分配instance
希望容量<br>最小容量<br>最大容量
创建完成后EC2-instance会出现一台新instance
EBS volume
快照(Snapshot)
Linux
Disk
UUID
常用命令
fdisk 分区
lsblk 查看设备信息
lsblk -f 查看UIUID信息
/etc/fstab 挂载相关配置文件
lsblk -dno UUID /dev/<font color="#4669ea">nvme1n1p2</font> | awk '{print "UUID=" $1 " <font color="#4669ea">/export xfs</font> defaults 0 0"}' | sudo tee -a /etc/fstab
lsblk -dno UUID /dev/<font color="#4669ea">nvme1n1p1</font> | awk '{print "UUID=" $1 " <font color="#4669ea">none swap</font> defaults 0 0"}' | sudo tee -a /etc/fstab
sudo mount 挂载
sudo mount -a 挂载全部
sudo reboot 重启
free -m 查看内存 (RAM) 使用情况
sudo growpart /dev/nvme0n1 3 扩容分区,延长分区边界至磁盘末尾
命令解析: growpart 是“增长分区”的意思。空格后面跟着磁盘路径 /dev/nvme0n1,再后面是分区号 3。
sudo xfs_growfs / 扩容系统,铺设文件系统以填充新空间
命令解析: 这里的 / 代表挂载点。因为我们要扩容的是根目录,所以直接指定 / 即可。<br>
df -h / 检查磁盘空间
命令拆解:<br>df: 是 Disk Free 的缩写。它的主要任务是报告文件系统的磁盘空间使用情况。<br>-h: 代表 Human-readable(人类可读)。如果不加 -h,系统会以“字节(Byte)”为单位显示数字,你会看到像 20971520 这种长得离谱的数字。加了 -h,它会自动换算成 G (Gigabytes)、M (Megabytes),让你一眼看懂。<br>/: 这是指定的路径。在这里代表根目录。如果不加路径,命令会列出系统里所有挂载的磁盘。<br><br>
SWAP
动态监控命令(Top)
Vi编辑器
文件属性
r=4(读取)<br>w=2(写入)<br>x=1(执行)<br><br>1~3位:所有用户,拥有者<br>4~6位:所有组,组内<br>7~9位:其他用户
Open SSH
Bastion
rpm
dnf
静态网站
常见目录
/tmp 临时文件。重启通常会消失。 酒店里的 一次性纸杯<br>
/home/ec2-user 用户家目录。存放你的个人文件和密钥。 你自己的 私人卧室<br>
/etc 系统配置文件。修改系统设置的地方。 房子的 总配电箱<br>
/bin 或 /usr/bin 可执行命令。存放 ls, cat 等命令。 你的 工具箱
ELB 负载均衡器
ALB (Application Load Balancer)
构建一个典型的三层 Web 架构,验证负载均衡、公私有子网划分及 NAT 出口配置
ALB 部署:位于两个可用区(1a & 1c)的 Public Subnets。<br><br>后端服务器:部署在两个可用区的 Private Subnets (NAT Subnets)。<br><br>流量路径:Internet -> IGW -> ALB -> WebAP Servers -> NAT Gateway -> Internet。
NLB (Network Load Balancer)
IAM
IAM user
user group
role
policy
effect
Allow
指示策略为允许访问
Deny
指示策略为拒绝访问
action
resource
condition
MFA
Access key
一个用户只能有2个access key
AWS CLI<br>
aws configure
常见子命令关键词
creat
delete
describe
attach / detach
modify
JASON
是一种轻量级数据交换格式,可以在多种语言写的数据程式之间进行交换(不是AWS CLI专用的)
语法和常见数据类型
String (字符串):由字符构成的串,JSON 中需要用双引号包住。<br>
Boolean (布尔):值只有 true 和 false 两种,不需要引号。<br>
Number (数字):数字类型,不需要引号。<br>
Object (对象)
是一个无序的键值对集合。<br><br>使用大括号 { } 闭合,以 { 开始,以 } 结尾。<br><br>每个键值对用逗号分开,Key 必须为 String,Value 可以是任何基本类型。<br><br>取值时使用 Key 取 Value。
Array (数组/序列)
是一个有序的值集合(没有键)。<br><br>使用方括号 [ ] 闭合,以 [ 开始,以 ] 结尾。<br><br>每个值用逗号分开,值可以是任何基本类型。<br><br>取值时使用序号取(从 0 开始数,* 代表所有)。
S3
对象存储 (Object Storage)<br>
不同于传统文件管理的文件存储方式。
桶 (Bucket)<br>
S3 中用于存储对象的容器。
版本管理 (Versioning)
开启后保留文件的各个修改版本。存陈旧文件时通常没必要开启。
阻止公共访问<br>
默认堵塞公开访问,仅限本账户访问。
存储桶策略 (Bucket Policy)
自定义访问限制,如限定某个 AWS 账号或特定 IP 访问。
常见 CLI 命令
aws s3 cp (复制)
aws s3 cp /root/test s3://example-bucket/
将本地 Linux 路径 /root/ 下名为 test 的文件,上传到名为 example-bucket 的 S3 存储桶中
aws s3 cp s3://example-bucket/test ./
将 S3 存储桶 example-bucket 中名为 test 的文件,下载到本地当前的目录下(./ 代表当前路径)
aws s3 mv (移动)
aws s3 ls (列表)
aws s3 ls s3://example-bucket/
列出 (list) 该存储桶内所有的文件(对象)信息。执行后你会看到文件名、文件大小以及最后修改时间。
Endpoint
VPC Endpoint<br>
使 VPC 内设备无需通过互联网网关或 NAT 即可与 AWS 服务建立连接。
接口终端节点 (Interface Endpoint)
是一个网络接口 (ENI),具备私有 IP。访问原本的 URL 会自动解析到该私有 IP。
接在私有子网中
具有私有IP地址、安全组
ec2
VPC
Subnet
Security group
网关终端节点 (Gateway Endpoint)
一种特殊的网关,作为路由表中的路由目标。目前仅支持 S3 和 DynamoDB。
s3
VPC
Rout table
CloudWatch
指标 (Metrics)<br>
CloudWatch 监控的各类数据。默认会获取一些 AWS 资源的指标,如需更多指标,托管型服务需到该资源处设置;EC2 实例可通过安装 CloudWatch Agent 实现。
CloudWatch Agent
给虚拟机使用的监控中间件,可以收集更多细粒度的指标。
报警 (Alarm)
根据某指标设定阈值,可以实现报警功能,以及设置报警后的联动动作。
日志组 (Log Group)
存放各类日志。但资源本身无法进行任何收集日志文件的设置。AWS 资源的日志(如 ALB)通常需要到该资源处进行设置;EC2 内部的日志需要安装并设置 CloudWatch Agent 来收集。
日志详情 (Logs Insights)
查询日志组中日志内容的筛选器(有一套简单的固定写法)。
SNS
主题 (Topic)<br>
一个逻辑访问点和通信通道。发布者发送消息至主题,消息会分发给所有订阅者。
订阅 (Subscription)<br>
接收发布到主题的消息。
发布者 (Publisher)<br>
向主题发送消息的程序、虚拟资源或 AWS 资源。
支持的订阅端点 (Subscribers)<br>
应用服务: Amazon SQS, AWS Lambda, HTTPS。<br>
消息传递: Amazon Kinesis Data Firehose。<br>
个人/设备 (A2P): 短信 (SMS), 移动推送 (Mobile Push), 邮件 (Email)。
RDS
data base 数据库
概念
DBMS(数据库管理系统)<br>
进行数据的组织、存储和管理;数据库的建立和维护;提供给人员和应用程序操作数据和数据库的接口的软件。
DBS(数据库系统)
由 DBMS、数据库、硬件平台、数据库管理员等共同构成的数据库存储系统(是一个抽象概念)。<br>
关系型数据库(Relational Database)
关系型数据库把数据看作是一个二维表格,任何数据都可以通过行 + 列来唯一确定,它存储的数据逻辑结构看起来就是一个 Excel 表。
表格(table/表)
关系型数据库中储存数据的一个工具。一个数据库中可以有很多表,如何根据实际情况设计表和数据类型等,一般是开发工程师的工作。
常见关系型数据库管理系统软件
MySQL
PostgreSQL
Oracle
SQL Server
カラム(column/列/字段)
数据库客户端程序
如果要连接到 DBMS 的话,不管是从数据库服务器本地,还是从其它服务器远程连接到 DBMS,都是需要一个 DB 的客户端程序的。
数据库从底层~客户端的架构
DB Server
DBMS(例:MySQL)
数据库1
数据库2
OS
硬件
SQL文
数据查询
SELECT
数据定义
CREATE
CREATE DATABASE DB名
创建数据库
CREATE TABLE 表名(列名 数据类型 ,列名 数据类型 )
ALTER
ALTER TABLE 表名 RENAME TO 新名
修改某表
DROP
DROP TABLE 表名
DROP COLUMN 列名
删除某列
数据操纵
INSERT
INSERT INTO 表名 VALUES (..)
插入一行数据
UPDATE
UPDATE 表名 SET 列 = 值
更改现有数据
DELETE
DELETE FROM 表名 WHERE ..
删除特定数据
数据控制
GRANT
REVOKE
数据类型
INT<br>
整数
CHAR(N)<br>
定长字符串(查表效率高,但可能浪费空间)
VARCHAR(N)<br>
变长字符串(节省空间,效率略低)
DATETIME
日期和时间
约束
NOT NULL<br>
设定某列不能为空<br>
UNIQUE
设定某列的值不能重复
Route53
别名 (Alias):AWS 特有功能,可以直接把域名映射到 ALB(负载均衡器) 等 AWS 资源名上,而不需要管背后的 IP 怎么变。
CloudFormation 自动化部署
IaC 基础设施即代码
IaC 是一种理念和方法论,而 CloudFormation 是 AWS 实现这一理念的具体工具
stack 堆栈
Template 模板
YAML
JASON
Template 核心段落
Parameters 参数
Default
默认值
AllowedValues
允许将来手动指定的Value值,它必须是个Array
Parameters:<br> MyInstanceType:<br> Type: String<br> Default: t2.micro<br> <b>AllowedValues: </b> # 这里的列表就是一个 Array<br> - t2.micro # Array 的元素 1<br> - t2.small # Array 的元素 2<br> - m5.large # Array 的元素 3
语法结构
Parameters:<br> ParameterLogicalID: # 参数的逻辑ID,必须在模板中唯一(大小写字母、数字)<br> Type: DataType # 数据类型(例如 String 代表字符串,Number 代表数字)<br> ParameterProperty: value # 参数的其他属性
Parameters:<br> EnvName:<br> Type: String<br> AllowedValues: [dev, prd] # 用于匹配网络堆栈的导出名<br><br> <font color="#e74f4c"># --- 关键修改:定义 SSM 参数类型 ---<br> # 函数意义:告诉 AWS 去官方参数仓库里找特定的值<br> # 为什么要加:确保镜像 ID 永远有效,且不需要手动硬编码<br> <br>LatestAmiId:<br> Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' # 类型必须是 Image::Id,这样系统才知道这是个镜像 ID<br> Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64' # 这是官方维护的 Amazon Linux 2023 最新版路径</font><br><br>Resources:<br> Instance1:<br> Type: AWS::EC2::Instance # 创建第一台实例<br> Properties:<br> # 函数意义:!Ref 引用上面定义的 SSM 参数<br> # 为什么要加:实现镜像 ID 的自动获取,避免出现 "ID does not exist" 的错误<br> ImageId: !Ref LatestAmiId <br> InstanceType: t3.micro # 东京区标准规格<br> <br> # 函数意义:!ImportValue 导入网络堆栈导出的子网 ID<br> # 为什么要加:满足跨堆栈传参要求,让实例能找到对应的网络环境<br> SubnetId: !ImportValue <br> Fn::Sub: "${EnvName}-sub1-id"<br> <br> # 函数意义:导入导出的安全组 ID<br> # 为什么要加:确保实例绑定了“开启 TCP 22”规则的安全组<br> SecurityGroupIds:<br> - !ImportValue <br> Fn::Sub: "${EnvName}-sg-id"<br> <br> Tags:<br> - Key: Name<br> Value: !Sub "${EnvName}-instance-1" # 动态生成实例名称<br><br>
Pseudo Parameters 模拟参数
AWS::AccountId
自动获取当前部署堆栈的 AWS 账号 ID
AWS::NoValue
表示“无值”,常配合 Fn::If 使用,表示在某种条件下不填入任何属性
Mappings 映射
env
env 是连接 Parameters 和 Mappings 的桥梁
dev
Development (开发环境) 程序员写代码、做简单测试的地方。配置通常较低,网段较小
VPC 网段为 10.0.0.0/16
stg
Staging (阶段/测试环境) 模拟正式环境的镜像环境,用于在上线前做最后的压力和集成测试
VPC 网段为 10.1.0.0/16
prd
Production (生产/正式环境) 真正给用户使用的环境。必须保证高稳定性和安全性
VPC 网段为 10.2.0.0/16
Conditions
常用函数
Fn::Equals
判断相等
Fn::If
如果是则A,否则B
Conditions:<br> IsPrd: !Equals [ !Ref EnvName, prd ] # 判断环境是否为生产环境
Resource
Logical ID
Type
Properties
DependsOn
Condition
Export ~ Import
第一步:导出(Export)<br>在“源模板”(如网络模板)的 Outputs 部分,必须使用 Export 属性给这个值起一个全局唯一的名称。<br><br>代码示例(逻辑):<br><b><font color="#e74f4c">Outputs:<br></font></b> VPCIDOutput:<br> Value: !Ref MyVPC<br> Export:<br> Name: SharedVPCID # 这是导出的名字,别人就靠这个名字找你<br><br>第二步:导入(Import)<br>在“目标模板”(如数据库模板)中,使用 Fn::ImportValue 引用刚才导出的名称。<br><br>代码示例(逻辑):<br><b><font color="#e74f4c">Resources:<br></font></b> MyDBSubnet:<br> Type: AWS::EC2::Subnet<br> Properties:<br> VpcId: !ImportValue SharedVPCID # 直接把名字拿过来用
常用内置函数
!Ref logicalID<br>
使用逻辑 ID 返回 Parameters 或 Resources 的值
Fn::GetAtt: [ logicalIDOfResource.attributeName ] 或 !GetAtt logicalIDOfResource.attributeName<br>
获取资源的特定属性(例如获取 EC2 的公网 IP)
注意:具体 Ref 和 Fn::GetAtt 能返回哪些值是预设好的,需查看官方文档(绝大多数 Resource 用 Ref 返回的是它的 ID)。
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ] 或 !FindInMap [ MapName, TopLevelKey, SecondLevelKey ]<br>
从 Mapping 表中提取对应环境的数值
Fn::ImportValue: ExportName 或 !ImportValue ExportName<br>
引用另一个堆栈导出的 Output 的值
Fn::Sub<br>
将变量拼接到字符串中
方式1: String${Var1Name} StringString${Var2Name}
方式2:(引用 Parameter):String${Parameter01LogicalID} StringString${Parameter02LogicalID}
Terraform
特点
多云支持(可以同时管 AWS, Azure, 阿里云, 甚至腾讯云)
语言
.tf格式
状态管理
会生成一个 terraform.tfstate 文件,你需要自己管理这个“进度条”
部署方式
主要通过命令行 (CLI) 操作,比如 terraform plan (看预览) 和 terraform apply (执行)
Terraform 模块(Blocks)
terraform
设置 Terraform 程序自身的版本要求,以及指定要对接哪种云服务
provider
配置云服务商。 比如指定你要操作 AWS 的哪个区域(Region),或者填入访问密钥
resource
最核心部分。 用来定义具体的资源,比如一个 VPC、一台 EC2 实例
# 定义 VPC<br>resource "aws_vpc" "my_vpc" {<br> cidr_block = "10.0.0.0/16"<br> tags = { Name = "practice-vpc" }<br>}<br><br># 定义子网 1a<br>resource "aws_subnet" "sub_1a" {<br> vpc_id = aws_vpc.my_vpc.id<br> cidr_block = "10.0.1.0/24"<br> availability_zone = "ap-northeast-1a"<br> tags = { Name = "practice-sub-1a" }<br>}<br><br># 定义子网 1c<br>resource "aws_subnet" "sub_1c" {<br> vpc_id = aws_vpc.my_vpc.id<br> cidr_block = "10.0.2.0/24"<br> availability_zone = "ap-northeast-1c"<br> tags = { Name = "practice-sub-1c" }<br>}<br><br># 定义 IGW 并绑定到 VPC<br>resource "aws_internet_gateway" "my_igw" {<br> vpc_id = aws_vpc.my_vpc.id<br> tags = { Name = "practice-igw" }<br>}
variable
定义变量。 类似于 CloudFormation 的 Parameters
# 资源前缀名变量(设置了默认值)<br># variable 是声明变量的关键字。<br># "res_prefix" 是这个变量的名字。在代码其他地方引用它时,要写成 var.res_prefix<br>variable "res_prefix" {<br> type = string #限制这个变量只能输入字符串(文字)<br> default = "prod" #设置这个变量的默认值为 my-lab<br>}<br><br># CIDR 前半段变量(故意不给默认值,测试交互界面)<br>variable "cidr_prefix" { #定义了一个名为 cidr_prefix 的变量,用来接收 IP 网段的前半部分(如 10.0 或 192.168)<br> type = string<br>}
resource "aws_vpc" "my_vpc" {<br># 拼接 CIDR 前半段变量,生成如 10.0.0.0/16<br> cidr_block = "${var.cidr_prefix}.0.0/16" <br> tags = {<br> # ${var.res_prefix} 会被替换成你输入的变量值<br> Name = "${var.res_prefix}-vpc" }<br>}
data
查询已有资源。 比如查询 AWS 官方最新的镜像 ID
output
定义输出。 类似于 CloudFormation 的 Outputs
# 输出子网 1a 的 ID,供外部调用<br>output "lisa_sub_1a_id" { # 这是我定义的“output标签名”<br> value = aws_subnet.sub_1a.id #这是引用我vpc.tf里的资源 #引用语法:模块内资源类型.资源名称.属性名称<br>} <br><br># 输出 VPC 的 ID #模块传参练习需要<br>output "lisa_vpc_id" {<br> value = aws_vpc.my_vpc.id #语法:模块内资源类型.资源名称.属性名称<br>}
module
模块化引用。 允许你重复调用别人写好的代码包
# 调用 EC2 模块并实现跨模块传参<br>module "my_ec2" {<br> source = "../modules/ec2" # 指向新创建的机器模块目录<br> <br> # 跨模块传参的核心逻辑:<br> # 接收方变量名 = 身份类型(module).模块名.output标签名<br> input_subnet_id = module.my_network.lisa_sub_1a_id <br>}
Meta-Arguments
Shell Script
变量、数据类型
支持的数据类型
String (字符串)<br>
最常用的类型。必须用双引号 " 或单引号 ' 包围
Number (数字)<br>
纯数字,不需要引号
Array (数组)<br>
有序的值集合。用小括号 () 包围,值之间用空格分隔。
Associative Array (关联数组)
类似键值对(Object)键(Key)必须是字符串
核心语法:申明与引用
var_name="value"
申明字符串
注意:等号两边绝对不能有空格
declare -i num=100
申明整数
使用 declare -i 显式申明为整数
arr=("A" "B" "C")
申明数组
使用小括号定义
${var_name}
引用变量
使用 $ 调用。在大括号外拼接字符串时,大括号不可省略
Shell 传参(引数を渡す)
$0<br>
※ 执行的文件名
$#
传递到脚本的参数个数
$*
所有向脚本传递的参数拼接成的单个的字符串
$@
所有向脚本传递的参数
$$
脚本运行的当前进程 ID 号
$!
后台运行的最后一个进程的 ID 号
$?
※※ 显示最近一个命令的退出状态。0 表示没有错误,其他任何值表明有错误
Shell 传参机制
<b><u>位置参数:<br></u></b><br>$0:执行的脚本文件名本身。<br>$1:接收第一个参数(如 Lisa)。<br>$2:接收第二个参数(如 22)。<br><br><b><u>特殊参数处理:<br></u></b><br>$#:统计你一共传了几个参数。<br>$?:极其重要。显示上一个命令的退出状态。0 代表成功,其他数值代表出错了。<br>$* 与 $@:代表所有参数的集合。
Shell Script
Shebang
#!/bin/bash
Shell 符号
输出输入
<
输入
输入重定向:把文件的内容喂给命令处理
文件 - 命令
>
覆盖写
把命令的结果写进文件。如果文件已有内容,会直接删掉重写<br>
echo "hello" > test.txt
命令 - 文件
>>
追加写
在文件的末尾添加新内容,不破坏原有内容
2> 或 2>>
错误输出
专门把报错信息存进文件,方便回头排查脚本为什么挂了
管道
|
管道符
极其重要。把前一个命令的“输出”直接塞给后一个命令作为“输入”
<font color="#4669ea">ps -aux | grep "nginx"</font>(先列出所有进程,再从中过滤出包含 nginx 的那行)
目录相关
引号
双引号 ""
会解析。里面的变量(如 $NAME)或命令会被替换成真实的值
单引号 ''
原样输出。里面写什么就打什么,完全不理会变量符号
反引号 `
命令执行。Shell 会先跑反引号里的命令,把结果取出来再给外面用(现在常用 $() 代替)
其他
&
将程序放入后台运行。这样脚本就不用等这个耗时的任务跑完,可以直接跳到下一行
#
注释
正则表达(Regex)
*
匹配任意长度的字符(0个或多个)
?
匹配任意一个字符
[abcd]
匹配中括号里任意一个字符(要么是a,要么是b...)
[a-z]
匹配 a 到 z 范围内的任意一个字母
[!abcd]
匹配不在中括号里的任意一个字符
运算符
算术运算符 (Arithmetic Operators)
基础运算:+ (加)、- (减)、* (乘)、/ (除)、% (求余)
逻辑比较:== (相等) 和 != (不相等),通常用于数字比较,相等则返回 true
数字关系运算符 (Relational Operators)
这是运维脚本中最常用的部分,用于判断数值大小:
-eq:等于 (Equal)。
-ne:不等于 (Not Equal)。
-gt:大于 (Greater Than)。
-lt:小于 (Less Than)。
-ge:大于等于 (Greater or Equal)。
-le:小于等于 (Less or Equal)。
字符串运算符 (String Operators)
用于检查文本内容:
=:两个字符串是否完全相同。
!=:两个字符串是否不同。
-z:字符串长度是否为 0 (即是否为空)。
-n:字符串长度是否不为 0 (即是否有内容)。
文件测试运算符 (File Test Operators)
这是 Shell 的灵魂,专门用来检查文件系统状态:
-e:文件或目录是否存在 (Exist)。
-d:是否为目录 (Directory)。
-f:是否为普通文件 (File)。
-r / -w / -x:文件是否具有 读 / 写 / 执行 权限。
-s:文件内容是否不为空。
逻辑运算符 (Logical Operators)
用于组合多个判断条件:
!:非 (相反),原本为 true 则返回 false。
&&:与 (AND),两边条件都成立才为 true。
||:或 (OR),只要有一边条件成立就为 true。
if/else
#!/bin/bash
# 1. 获取用户通过命令行传进来的年份参数
year=$1
# 2. 检查用户是否输入了参数(使用 -z 检查变量是否为空)
if [ -z "$year" ]; then #-z:检查字符串是否为空
echo "请输入一个年份,例如:./leap_year.sh 2000" #echo:打印提示信息
exit 1 # exit:退出脚本,1表示有错误发生
fi #fi含义:结束if语句块
# 核心运算:求余数 (%) 并进行逻辑判断
# 利用双括号 (( )) 进行算术运算
# && 代表“与”,|| 代表“或”
# (能被400整除) 或者 (能被4整除 且 不能被100整除)
if [ $((year % 400)) -eq 0 ] || ([ $((year % 4)) -eq 0 ] && [ $((year % 100)) -ne 0 ]); then
# 满足条件,输出是闰年
echo "$year 是闰年"
else
# 不满足条件,输出不是闰年
echo "$year 不是闰年"
fi
Case文
多分支选择语句
read
声明一个变量,这个变量的值需要通过交互式界面进行输入,一般为了用户体验,会先打印该如何操作的提醒
loop 循环结构
for
循环处理(Loop)执行代码,只有满足某种特定条件时才会停止。例如处理完数组中的所有值,或者达到预设的循环次数
for循环数组语法
for var in ${array[@]}
do
command1
command2
...
commandN
done
C语言式for写法
for ((初始化数字; 循环继续的条件; 数字在每次循环最后自增或自减))
do
command1
...
commandN
done
#示例数据:1 2 3 4 5 6。<br>#从第二个值 2 开始循环,隔一个值循环一次,输出 2 4 6。<br><br>#!/bin/bash<br># 定义数组<br>numbers=(1 2 3 4 5 6)<br><br># 使用标准的 for 循环,每次递增 1<br>for ((i=0; i<${#numbers[@]}; i++))<br>do<br> # 判断索引 i 是否为奇数(对应第2, 4, 6个值)<br> #在 Shell 中,判断一个数是否为奇数,可以使用 $((i % 2)) -ne 0(即 $i$ 除以 2 的余数不等于 0)<br> if [ $((i % 2)) -ne 0 ]; then<br> echo "索引为 $i 的值是: ${numbers[i]}"<br> fi<br>done
while
只要满足条件就会一直运行
跳出循环
break
continue
function(関数/函数)
函数允许你自定义一段代码并将其封装起来
封装后的代码可以在同一个 Shell 脚本中的任意位置通过“函数名”进行调用,从而避免重复编写相同的代码。
Shell文件引用
可以引用其他shell脚本文件在当前环境下运行
source filepath
Substring(子字符串截取)
${Stringname: offset:length}
offset:开始切割的位置(从 0 开始数)
length:切割几位字符
Shell脚本编程
coding rules コーディングルール
变量名 函数名 的写法。比如,要言简意赅的表现出变量或函数的意义,如果有多个单词的话用什么方式写(日本项目中shell的变量名一般用下划线,如exec_user;函数名用开头大写,如UserCheck)
嵌套时要空格(日本项目中shell一般4个空格为单位)
一些通用的函数写到一个共用的文件,其他脚本用source引用
可能会有一些固定要求的,在main处理之前要做的,共通的事前处理,比如确认执行脚本的用户,确认执行脚本的主机等等
脚本程序要有自己查错的功能,以及记录自身日志的功能 >>
要写清楚备注
脚本结束的时候要用exit指定退出状态码,正确状态为0,不同类型的错误状态码的具体数字可能会规定
记录处理对象的文件,可能需要跟脚本文件分开记录,(为了避免处理对象出现变化的时候修改含有代码的文件)
标准脚本头部(Header)
#!/bin/bash
#################################################################################
# システム名 : xxxxシステム
# 処理名 : ログ分割処理
# スクリプト名 : log_cut.sh
# 版数 : 1.0
#-------------------------------------------------------------------------------#
# 変更履歴 : 1.0 新規作成 李
#
#################################################################################
# ----グローバル変数定義----------------------------------------------------------#
script_infra_common=/opt/scripts/infra/lib/common_function.sh
log_list=/opt/scripts/infra/lib/log.list
0 条评论
下一页