Day-3-变量与数据类型

Day 3: 变量与数据类型

🎯 学习目标

  • 理解变量的概念和作用
  • 掌握 PowerShell 的基本数据类型
  • 学会变量的创建、赋值和使用
  • 理解变量的作用域
  • 掌握数据类型的转换
  • 学会使用常量和只读变量

💡 核心概念

1. 什么是变量?

变量就像是存储数据的"容器"。你可以把数据放进这个容器,然后在需要的时候取出来使用。

生活中的比喻

  • 变量 = 盒子
  • 变量名 = 盒子上的标签
  • 变量值 = 盒子里的东西

示例

# 创建一个盒子(变量),名字叫 name,里面装着"张三"
$name = "张三"

# 创建一个盒子,名字叫 age,里面装着数字 30
$age = 30

2. 变量的命名规则

2.1 命名规范

变量名必须以 $ 符号开头

# ✅ 正确
$name
$age
$user_name
$UserName

# ❌ 错误
name      # 缺少 $ 符号
$2user    # 不能以数字开头
$user-name # 不能包含连字符

命名建议

  • 使用有意义的名称
  • 采用驼峰命名法(Pascal Case 或 camelCase)
  • 避免使用 PowerShell 保留字

好的命名示例

$firstName = "张三"
$lastName = "李四"
$userAge = 25
$isAdmin = $true

3. PowerShell 的数据类型

PowerShell 是一种弱类型语言,但你仍然需要了解不同的数据类型。

3.1 基本数据类型

字符串(String)

$message = "Hello World"
$emptyString = ""

整数(Integer)

$count = 100
$negative = -50

浮点数(Double)

$price = 19.99
$pi = 3.14159

布尔值(Boolean)

$isValid = $true
$isComplete = $false

数组(Array)

$numbers = 1, 2, 3, 4, 5
$names = "张三", "李四", "王五"

哈希表(Hashtable)

$user = @{
    Name = "张三"
    Age = 30
    City = "北京"
}

3.2 特殊值

$null – 表示空值:

$empty = $null

$true 和 $false – 布尔值:

$isTrue = $true
$isFalse = $false

4. 变量的赋值和使用

4.1 赋值操作

直接赋值

$name = "张三"
$age = 30
$height = 1.75

使用表达式赋值

$sum = 10 + 20
$product = 5 * 6

命令结果赋值

$currentDir = Get-Location
$processes = Get-Process

4.2 访问变量值

$name = "张三"
Write-Output $name           # 输出:张三
Write-Output "我的名字是 $name"  # 输出:我的名字是 张三

在双引号字符串中使用变量

$name = "张三"
$age = 30
Write-Output "我的名字是 $name,今年 $age 岁"
# 输出:我的名字是 张三,今年 30 岁

5. 数据类型转换

5.1 自动类型转换

PowerShell 会自动进行类型转换:

# 数字 + 字符串 = 字符串
$result = 10 + "20"
Write-Output $result  # 输出:1020

# 数字 + 数字 = 数字
$result = 10 + 20
Write-Output $result  # 输出:30

5.2 强制类型转换

使用类型转换操作符

# 字符串转整数
$stringNumber = "100"
$number = [int]$stringNumber
Write-Output $number + 50  # 输出:150

# 数字转字符串
$number = 100
$string = [string]$number
Write-Output "数字是:$string"  # 输出:数字是:100

常用类型转换

[int]       # 整数
[string]    # 字符串
[double]    # 浮点数
[bool]      # 布尔值
[datetime]  # 日期时间

示例

# 字符串转整数
$text = "123"
$num = [int]$text
Write-Output $num + 10  # 输出:133

# 字符串转日期
$dateString = "2026-03-31"
$date = [datetime]$dateString
Write-Output $date  # 输出:2026年3月31日 0:00:00

# 数字转布尔
$zero = 0
$one = 1
$boolZero = [bool]$zero   # $false
$boolOne = [bool]$one     # $true

6. 变量的作用域

作用域决定了变量在哪里可以被访问。

6.1 作用域类型

全局作用域

$global:name = "张三"
# 在脚本的任何地方都可以访问

脚本作用域

$script:name = "李四"
# 只在当前脚本中有效

局部作用域

function Test {
    $local:name = "王五"
    # 只在函数内部有效
}

6.2 作用域修饰符

# 创建全局变量
$Global:myVar = "全局变量"

# 创建脚本变量
$Script:myVar = "脚本变量"

# 创建私有变量
$Private:myVar = "私有变量"

7. 常量和只读变量

7.1 创建只读变量

使用 Set-Variable 创建只读变量

Set-Variable -Name "readOnly" -Value "不能修改" -Option ReadOnly
$readOnly = "新值"  # 这会报错:无法覆盖变量 readOnly,因为它是只读变量或为常量

创建常量(Constant)

Set-Variable -Name "PI" -Value 3.14159 -Option Constant
# $PI = 3.14159  # 这会报错,因为是常量

⚠️ 重要区别

  • ReadOnly(只读):变量不能被修改,但可以被删除
  • Constant(常量):变量不能被修改,也不能被删除

错误的示例

# ❌ 这样创建的不是只读变量
$readOnly = "不能修改"
$readOnly = "新值"  # 这不会报错!变量被成功修改了

7.2 使用常量

# 定义常用常量
Set-Variable -Name "MaxAttempts" -Value 3 -Option Constant
Set-Variable -Name "DefaultTimeout" -Value 30 -Option Constant

# 使用常量
Write-Output "最大尝试次数:$MaxAttempts"
Write-Output "默认超时时间:$DefaultTimeout 秒"

8. 数组操作

8.1 创建数组

# 方式1:逗号分隔
$numbers = 1, 2, 3, 4, 5

# 方式2:范围运算符
$numbers = 1..10

# 方式3:空数组
$emptyArray = @()

8.2 访问数组元素

$fruits = "苹果", "香蕉", "橙子"
Write-Output $fruits[0]  # 输出:苹果
Write-Output $fruits[1]  # 输出:香蕉
Write-Output $fruits[-1] # 输出:橙子(最后一个)

8.3 数组操作

# 获取数组长度
$numbers = 1, 2, 3, 4, 5
Write-Output $numbers.Length  # 输出:5

# 添加元素
$numbers += 6

# 遍历数组
foreach ($num in $numbers) {
    Write-Output $num
}

# 检查元素是否存在
if (3 -in $numbers) {
    Write-Output "数组中包含 3"
}

9. 哈希表操作

9.1 创建哈希表

# 方式1:创建时定义
$user = @{
    Name = "张三"
    Age = 30
    City = "北京"
}

# 方式2:逐步添加
$user = @{}
$user["Name"] = "张三"
$user["Age"] = 30
$user["City"] = "北京"

9.2 访问哈希表

$user = @{
    Name = "张三"
    Age = 30
    City = "北京"
}

# 访问单个值
Write-Output $user["Name"]  # 输出:张三
Write-Output $user.Name     # 输出:张三

# 访问所有键
Write-Output $user.Keys  # 输出:Name, Age, City

# 访问所有值
Write-Output $user.Values  # 输出:张三, 30, 北京

🎮 实战示例

示例 1: 用户信息管理

# 创建用户信息哈希表
$user = @{
    Name = "张三"
    Age = 30
    Email = "zhangsan@example.com"
    Department = "技术部"
}

# 显示用户信息
Write-Output "用户信息:"
Write-Output "姓名:$($user.Name)"
Write-Output "年龄:$($user.Age)"
Write-Output "邮箱:$($user.Email)"
Write-Output "部门:$($user.Department)"

# 更新用户信息
$user.Age = 31
Write-Output "更新后的年龄:$($user.Age)"

示例 2: 商品价格计算

# 商品价格和数量
$prices = 19.9, 29.9, 39.9
$quantities = 2, 1, 3

# 计算总价
$total = 0
for ($i = 0; $i -lt $prices.Length; $i++) {
    $itemTotal = $prices[$i] * $quantities[$i]
    $total += $itemTotal
}

Write-Output "订单总价:$total 元"

示例 3: 数据类型转换

# 从用户输入获取年龄
$userInput = "25"

# 转换为整数
$age = [int]$userInput

# 验证转换结果
if ($age -gt 0) {
    Write-Output "年龄:$age"
    # 计算出生年份
    $currentYear = (Get-Date).Year
    $birthYear = $currentYear - $age
    Write-Output "出生年份:$birthYear"
} else {
    Write-Output "请输入有效的年龄"
}

示例 4: 数组筛选

# 数字列表
$numbers = 15, 8, 23, 42, 7, 19, 33, 5

# 筛选大于 20 的数字
$largeNumbers = $numbers | Where-Object { $_ -gt 20 }

Write-Output "大于 20 的数字:"
$largeNumbers | ForEach-Object { Write-Output $_ }

# 筛选偶数
$evenNumbers = $numbers | Where-Object { $_ % 2 -eq 0 }
Write-Output "偶数:"
$evenNumbers | ForEach-Object { Write-Output $_ }

⚠️ 重要注意事项

1. 变量命名最佳实践

# ✅ 好的命名
$userName = "张三"
$fileCount = 10
$isValid = $true

# ❌ 避免的命名
$x = "张三"
$n = "张三"
$flag = $true

2. 类型转换陷阱

# 字符串拼接 vs 数字加法
$a = "10"
$b = "20"
Write-Output ($a + $b)  # 输出:1020(字符串拼接)

$a = 10
$b = 20
Write-Output ($a + $b)  # 输出:30(数字相加)

3. 空值处理

$value = $null

# 检查变量是否为空
if ($null -eq $value) {
    Write-Output "变量为空"
}

# 使用空值合并运算符
$result = $value -ne $null ? $value : "默认值"
Write-Output $result

4. 数组和哈希表的区别

# 数组:索引访问
$array = 1, 2, 3
Write-Output $array[0]

# 哈希表:键访问
$hash = @{Key = "Value"}
Write-Output $hash["Key"]

✍️ 练习任务

基础练习

  1. 变量创建

    • 创建变量存储你的姓名、年龄、城市
    • 创建变量存储一个数字列表
    • 创建变量存储一个用户信息哈希表
  2. 类型转换

    • 将字符串 "123" 转换为整数并加上 50
    • 将数字 3.14159 转换为整数
    • 将数字 0 转换为布尔值并查看结果
  3. 数组操作

    • 创建一个包含 5 个数字的数组
    • 计算数组中所有数字的和
    • 找出数组中最大的数字

进阶练习

  1. 哈希表操作

    • 创建一个学生信息哈希表(姓名、年龄、班级、成绩)
    • 添加一个新的字段"是否及格"
    • 根据成绩判断是否及格(60分以上)
  2. 数据筛选

    • 创建一个数字数组 [12, 45, 67, 23, 89, 34, 56]
    • 筛选出所有大于 40 的数字
    • 筛选出所有偶数
    • 筛选出所有能被 3 整除的数字

实战挑战

  1. 购物车系统

    • 创建一个商品信息数组(商品名、价格、数量)
    • 计算每种商品的小计
    • 计算订单总价
    • 如果总价超过 100,显示"包邮",否则显示"运费 10 元"
  2. 学生成绩管理

    • 创建一个学生成绩哈希表
    • 添加姓名、语文、数学、英语成绩
    • 计算总分和平均分
    • 判断是否优秀(平均分≥90)、良好(80≤平均分<90)、及格(60≤平均分<80)

💡 常见问题 FAQ

Q1: PowerShell 的变量名区分大小写吗?

  • A1: PowerShell 不区分大小写,$Name$name 是同一个变量。但建议保持一致性,使用驼峰命名法。

Q2: 什么时候使用单引号,什么时候使用双引号?

  • A2: 单引号表示字面字符串(不解析变量),双引号表示可扩展字符串(解析变量)。

Q3: 如何删除一个变量?

  • A3: 使用 Remove-Variable 命令:
    Remove-Variable -Name "myVar"
    

Q4: 数组和哈希表有什么区别?

  • A4: 数组使用数字索引(0, 1, 2…),哈希表使用键名(Name, Age, Email…)。

Q5: 如何检查变量的类型?

  • A5: 使用 .GetType() 方法:
    $value = 123
    $value.GetType().Name  # 输出:Int32
    

📚 拓展阅读


🎓 今日总结

变量和数据类型是 PowerShell 编程的基础。通过掌握变量的创建、赋值、作用域,以及各种数据类型的转换,你可以开始编写实用的 PowerShell 脚本。记住:PowerShell 是弱类型语言,但了解数据类型对于编写健壮的脚本仍然很重要。

⏭️ 明天预告: Day 4 – 运算符与表达式,我们将深入学习 PowerShell 的各种运算符和表达式。


学习时间: 2026-03-31
课程进度: Day 3 / 30