变量基础 #

一、变量定义 #

1.1 基本语法 #

Shell变量定义不需要声明类型,直接赋值即可:

bash
# 变量定义(等号两边不能有空格)
name="张三"
age=25
city="北京"

# 错误示例(有空格)
# name = "张三"    # 错误!
# name= "张三"     # 错误!
# name ="张三"     # 错误!

1.2 变量命名规则 #

规则 说明 示例
首字符 必须是字母或下划线 name, _count
其他字符 字母、数字、下划线 user_name, var1
大小写 区分大小写 Namename 不同
不能使用 关键字和特殊字符 不能用 if, then, *
bash
# 合法变量名
name="张三"
_user="test"
userName="admin"
USER_NAME="root"
var1="value"

# 非法变量名
# 1name="test"     # 不能以数字开头
# user-name="test" # 不能包含连字符
# my var="test"    # 不能包含空格

1.3 命名规范 #

bash
# 常量:全大写,下划线分隔
readonly MAX_CONNECTIONS=100
readonly PI=3.14159

# 变量:小写,下划线分隔
user_name="张三"
file_path="/home/user"

# 函数名:小写,下划线分隔
get_user_info() {
    echo "获取用户信息"
}

# 局部变量:使用local关键字
my_function() {
    local count=0
}

二、变量使用 #

2.1 基本使用 #

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

# 使用变量(推荐使用花括号)
echo $name
echo ${name}

# 花括号的必要性
fruit="apple"
echo "I have two ${fruit}s"    # 正确: I have two apples
echo "I have two $fruits"      # 错误: 变量fruits不存在

2.2 变量引用方式 #

bash
name="张三"

# 方式一:$变量名
echo $name

# 方式二:${变量名}
echo ${name}

# 方式三:"$变量名"(推荐)
echo "$name"

# 方式四:"${变量名}"(推荐)
echo "${name}"

2.3 引号的使用 #

bash
name="张三"

# 双引号:保留变量替换
echo "你好, $name"      # 输出: 你好, 张三

# 单引号:原样输出
echo '你好, $name'      # 输出: 你好, $name

# 反引号:命令替换
echo "当前目录: `pwd`"  # 输出: 当前目录: /home/user
echo "当前目录: $(pwd)" # 推荐写法

2.4 变量拼接 #

bash
# 字符串拼接
first_name="张"
last_name="三"
full_name="${first_name}${last_name}"
echo "$full_name"    # 输出: 张三

# 与字符串拼接
prefix="Hello"
message="${prefix}, World!"
echo "$message"      # 输出: Hello, World!

# 路径拼接
dir="/home/user"
file="test.txt"
path="${dir}/${file}"
echo "$path"         # 输出: /home/user/test.txt

三、变量类型 #

3.1 局部变量 #

只在当前Shell或函数中有效:

bash
#!/bin/bash

# 局部变量
local_var="我是局部变量"

my_function() {
    # 函数内的局部变量
    local func_var="函数内变量"
    echo "$func_var"
}

echo "$local_var"    # 可以访问
my_function
echo "$func_var"     # 无法访问

3.2 环境变量 #

可以被子进程继承:

bash
# 定义环境变量
export MY_VAR="环境变量"

# 在子进程中可用
bash -c 'echo $MY_VAR'    # 输出: 环境变量

# 普通变量不能被继承
normal_var="普通变量"
bash -c 'echo $normal_var'    # 输出为空

3.3 只读变量 #

定义后不能修改:

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

# 或者
NAME="张三"
readonly NAME

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

3.4 变量类型对比 #

类型 定义方式 作用域 可继承
局部变量 var=value 当前Shell
环境变量 export var=value 当前Shell及子进程
只读变量 readonly var=value 当前Shell

四、变量操作 #

4.1 查看变量 #

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

# 查看所有变量
set

# 查看环境变量
env

# 查看特定变量
echo $name
echo ${age}

# 查看变量是否定义
echo ${name:-"未定义"}
echo ${undefined:-"默认值"}

4.2 删除变量 #

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

# 删除变量
unset name

# 验证删除
echo $name    # 输出为空

# 注意:只读变量不能删除
readonly PI=3.14159
unset PI      # 报错: cannot unset: readonly variable

4.3 变量默认值 #

bash
# 如果变量未定义,使用默认值
echo ${name:-"匿名"}        # 输出: 匿名

# 如果变量未定义,设置默认值并赋值
echo ${name:="张三"}        # 输出: 张三
echo $name                  # 输出: 张三

# 如果变量已定义,显示提示信息
name="李四"
echo ${name:+"已定义"}      # 输出: 已定义

# 如果变量未定义,显示错误信息
echo ${name:?"变量未定义"}  # 输出: 变量值
# echo ${undefined:?"变量未定义"}  # 报错并退出

4.4 变量操作符总结 #

操作符 说明 示例
$ 未定义则返回默认值 $
$ 未定义则设置默认值 $
$ 已定义则返回value $
$ 未定义则报错 $

五、变量赋值技巧 #

5.1 命令替换赋值 #

bash
# 使用$()进行命令替换
current_date=$(date +%Y-%m-%d)
current_user=$(whoami)
files_count=$(ls | wc -l)

echo "日期: $current_date"
echo "用户: $current_user"
echo "文件数: $files_count"

5.2 算术赋值 #

bash
# 使用(())
count=0
((count++))
echo $count    # 输出: 1

# 使用let
let count+=1
echo $count    # 输出: 2

# 使用expr
result=$(expr 5 + 3)
echo $result   # 输出: 8

# 使用$(( ))
sum=$((10 + 20))
echo $sum      # 输出: 30

5.3 从文件读取赋值 #

bash
# 读取文件第一行
first_line=$(head -n 1 file.txt)

# 读取整个文件
content=$(cat file.txt)

# 逐行读取
while IFS= read -r line; do
    echo "读取: $line"
done < file.txt

5.4 从用户输入赋值 #

bash
# 基本读取
echo -n "请输入名字: "
read name
echo "你好, $name"

# 带提示的读取
read -p "请输入年龄: " age
echo "你今年 $age 岁"

# 限时读取
read -t 5 -p "5秒内输入: " input

# 静默读取(密码)
read -s -p "请输入密码: " password
echo ""
echo "密码已接收"

六、变量作用域 #

6.1 全局变量 #

bash
#!/bin/bash

# 全局变量
global_var="全局变量"

test_scope() {
    echo "函数内访问: $global_var"
}

test_scope
echo "函数外访问: $global_var"

6.2 局部变量 #

bash
#!/bin/bash

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

test_local
echo "函数外: $local_var"    # 输出为空

6.3 变量覆盖 #

bash
#!/bin/bash

name="外部变量"

test_override() {
    local name="内部变量"
    echo "函数内: $name"
}

test_override
echo "函数外: $name"

输出:

text
函数内: 内部变量
函数外: 外部变量

七、实战示例 #

7.1 配置文件读取 #

bash
#!/bin/bash

# 配置文件
config_file="config.conf"

# 读取配置
while IFS='=' read -r key value; do
    # 跳过注释和空行
    [[ "$key" =~ ^#.*$ ]] && continue
    [[ -z "$key" ]] && continue
    
    # 设置变量
    declare "$key=$value"
done < "$config_file"

# 使用配置
echo "数据库: $DB_HOST"
echo "端口: $DB_PORT"

7.2 变量验证 #

bash
#!/bin/bash

# 验证必需变量
check_required_vars() {
    local missing=0
    
    for var in "$@"; do
        if [[ -z "${!var}" ]]; then
            echo "错误: 变量 $var 未定义"
            missing=1
        fi
    done
    
    return $missing
}

# 设置变量
DB_HOST="localhost"
DB_PORT="3306"

# 检查必需变量
if check_required_vars DB_HOST DB_PORT DB_USER DB_PASS; then
    echo "所有必需变量已定义"
else
    echo "请设置所有必需变量"
fi

7.3 动态变量名 #

bash
#!/bin/bash

# 动态变量名
for i in 1 2 3; do
    eval "var_$i=value_$i"
done

# 访问动态变量
echo $var_1    # 输出: value_1
echo $var_2    # 输出: value_2
echo $var_3    # 输出: value_3

# 更安全的方式
for i in 1 2 3; do
    declare "var_$i=value_$i"
done

# 使用间接引用
name="var_1"
echo ${!name}  # 输出: value_1

八、总结 #

8.1 变量要点 #

要点 说明
定义 变量名=值,等号两边无空格
使用 $变量名 或 $
引号 双引号保留变量替换,单引号原样输出
作用域 local定义局部变量,export定义环境变量
只读 readonly定义只读变量
删除 unset删除变量

8.2 最佳实践 #

  • 变量名使用小写字母和下划线
  • 常量使用大写字母
  • 使用花括号包裹变量名
  • 字符串使用双引号
  • 函数内使用local声明局部变量

8.3 下一步 #

你已经掌握了变量的基本使用,接下来让我们学习 特殊变量,了解Shell中的特殊变量!

最后更新:2026-03-27