变量基础 #
一、变量定义 #
1.1 基本语法 #
Shell变量定义不需要声明类型,直接赋值即可:
bash
# 变量定义(等号两边不能有空格)
name="张三"
age=25
city="北京"
# 错误示例(有空格)
# name = "张三" # 错误!
# name= "张三" # 错误!
# name ="张三" # 错误!
1.2 变量命名规则 #
| 规则 | 说明 | 示例 |
|---|---|---|
| 首字符 | 必须是字母或下划线 | name, _count |
| 其他字符 | 字母、数字、下划线 | user_name, var1 |
| 大小写 | 区分大小写 | Name 和 name 不同 |
| 不能使用 | 关键字和特殊字符 | 不能用 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