Skip to content

变量

变量定义

基本语法

bash
# 定义变量
变量名=值

# 注意:等号两边不能有空格
name="张三"
age=25
is_student=true

命名规则

bash
# 有效的变量名
name
user_name
USER_NAME
_name2

# 无效的变量名
2name      # 不能以数字开头
user-name  # 不能使用连字符
user name  # 不能包含空格
@name      # 不能使用特殊字符

命名约定

bash
# 全大写:环境变量
PATH
HOME
USER

# 小写:局部变量
name
age
count

# 下划线分隔:多词变量
user_name
file_path

变量使用

引用变量

bash
# 定义变量
name="张三"

# 使用变量
echo $name
echo ${name}

# 区分变量名
echo "${name}你好"  # 输出:张三你好
echo "$name你好"    # 输出:张三你好

变量赋值

bash
# 直接赋值
name="张三"
age=25

# 命令结果赋值
current_dir=$(pwd)
current_date=$(date +%Y-%m-%d)

# 命令替换(旧方式)
current_dir=`pwd`

# 算术运算
count=10
count=$((count + 1))

变量类型

字符串变量

bash
# 单引号:原样输出
message='Hello $name'  # 输出:Hello $name

# 双引号:解析变量
name="张三"
message="Hello $name"  # 输出:Hello 张三

# 不加引号:解析变量和通配符
message=Hello$name     # 输出:Hello张三

数字变量

bash
# 整数
count=10
total=100

# 算术运算
result=$((count + total))
result=$((count * 2))
result=$((count / 2))
result=$((count % 3))

布尔变量

bash
# Bash 没有真正的布尔类型
# 使用字符串表示
is_true=true
is_false=false

# 使用数字表示
is_enabled=1
is_disabled=0

# 判断
if [ "$is_true" = "true" ]; then
    echo "启用"
fi

只读变量

定义只读变量

bash
# 定义只读变量
readonly PI=3.14159
readonly MAX_SIZE=100

# 或使用 declare
declare -r PI=3.14159

# 尝试修改会报错
PI=3.14  # 报错:PI: readonly variable

使用场景

bash
# 常量定义
readonly CONFIG_FILE="/etc/config.conf"
readonly LOG_DIR="/var/log"
readonly MAX_RETRIES=3

删除变量

使用 unset

bash
# 定义变量
name="张三"

# 删除变量
unset name

# 使用变量会得到空值
echo $name  # 输出空行

注意事项

bash
# 只读变量不能删除
readonly PI=3.14
unset PI  # 报错:unset: PI: cannot unset: readonly variable

环境变量

查看环境变量

bash
# 查看所有环境变量
env
printenv

# 查看特定变量
echo $PATH
echo $HOME
echo $USER

设置环境变量

bash
# 临时设置(当前会话有效)
export PATH="/usr/local/bin:$PATH"
export EDITOR=vim

# 永久设置(添加到配置文件)
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

常用环境变量

bash
# 用户信息
echo $USER      # 当前用户名
echo $HOME      # 用户主目录
echo $SHELL     # 当前 Shell

# 系统信息
echo $PATH      # 命令搜索路径
echo $PWD       # 当前工作目录
echo $HOSTNAME  # 主机名

# 其他
echo $LANG      # 语言设置
echo $TERM      # 终端类型
echo $UID       # 用户 ID

特殊变量

位置参数

bash
#!/bin/bash

echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第三个参数: $3"
echo "所有参数: $@"
echo "参数个数: $#"

其他特殊变量

bash
#!/bin/bash

# 上一条命令的退出状态
echo "退出状态: $?"

# 当前 Shell 的进程 ID
echo "进程 ID: $$"

# 后台运行的最后一个进程的进程 ID
echo "后台进程 ID: $!"

# 选项参数
echo "选项参数: $-"

# 上一个命令的最后一个参数
echo "上一个参数: $_"

变量操作

字符串长度

bash
name="张三"

# 获取字符串长度
echo ${#name}  # 输出:2

# 获取数组长度
arr=(a b c)
echo ${#arr[@]}  # 输出:3

子字符串提取

bash
name="Hello World"

# 从位置 0 开始,提取 5 个字符
echo ${name:0:5}  # 输出:Hello

# 从位置 6 开始到结尾
echo ${name:6}    # 输出:World

# 提取最后 3 个字符
echo ${name: -3}  # 输出:rld

字符串替换

bash
name="Hello World"

# 替换第一个匹配
echo ${name/World/Bash}  # 输出:Hello Bash

# 替换所有匹配
echo ${name//l/L}        # 输出:HeLLo WorLd

# 删除匹配
echo ${name/World/}      # 输出:Hello

默认值

bash
# 如果变量未设置或为空,使用默认值
echo ${name:-"默认值"}

# 如果变量未设置,使用默认值
echo ${name:="默认值"}

# 如果变量已设置,使用默认值
echo ${name:+"默认值"}

# 如果变量未设置或为空,报错
echo ${name:?"变量未设置"}

变量作用域

局部变量

bash
#!/bin/bash

func() {
    local local_var="局部变量"
    echo "函数内: $local_var"
}

func
echo "函数外: $local_var"  # 输出空行

全局变量

bash
#!/bin/bash

global_var="全局变量"

func() {
    echo "函数内: $global_var"
    global_var="修改后的全局变量"
}

func
echo "函数外: $global_var"  # 输出:修改后的全局变量

变量检查

检查变量是否设置

bash
# 检查变量是否设置
if [ -z "$name" ]; then
    echo "变量未设置或为空"
fi

if [ -n "$name" ]; then
    echo "变量已设置且不为空"
fi

检查变量类型

bash
# 检查是否为数字
if [[ "$age" =~ ^[0-9]+$ ]]; then
    echo "是数字"
fi

# 检查是否为整数
if [[ "$age" =~ ^-?[0-9]+$ ]]; then
    echo "是整数"
fi

实用示例

示例1:用户输入

bash
#!/bin/bash

echo "请输入你的名字:"
read name

echo "请输入你的年龄:"
read age

echo "你好,$name!"
echo "你今年 $age 岁。"

示例2:配置文件

bash
#!/bin/bash

# 配置变量
CONFIG_FILE="/etc/config.conf"
LOG_DIR="/var/log/myapp"
MAX_SIZE=100

# 使用变量
echo "配置文件: $CONFIG_FILE"
echo "日志目录: $LOG_DIR"
echo "最大大小: $MAX_SIZE"

示例3:计数器

bash
#!/bin/bash

count=0

while [ $count -lt 5 ]; do
    echo "计数: $count"
    count=$((count + 1))
done

echo "最终计数: $count"

最佳实践

1. 使用引号

bash
# 好的做法
echo "$name"
echo "${name}你好"

# 不好的做法
echo $name
echo $name你好

2. 使用花括号

bash
# 好的做法
echo "${name}你好"
echo "${file_path}/file.txt"

# 不好的做法
echo $name你好
echo $file_path/file.txt

3. 检查变量

bash
# 好的做法
if [ -n "$name" ]; then
    echo "$name"
fi

# 不好的做法
echo $name

总结

Shell 变量的关键点:

  1. 定义变量:变量名=值(注意等号两边无空格)
  2. 引用变量:$变量名${变量名}
  3. 只读变量:readonlydeclare -r
  4. 删除变量:unset 变量名
  5. 环境变量:使用 export 导出
  6. 局部变量:在函数中使用 local

下一节我们将学习字符串的操作。