5.2.1 变量定义与命名规范(局部、全局、环境变量)
变量定义与命名规范(局部、全局、环境变量)#
1. 变量的基本定义与使用#
- 定义:
name=value(等号两侧不得有空格) - 读取:
$name或${name} - 变量默认类型为字符串
- 最小可执行示例(保存为
/tmp/vars_basic.sh):
#!/usr/bin/env bash
app_name="web"
port=8080
echo "app_name=$app_name"
echo "port=${port}"
- 执行与预期输出:
bash /tmp/vars_basic.sh
# app_name=web
# port=8080
- 命令解释:
#!/usr/bin/env bash:指定脚本解释器echo:打印变量值
2. 局部变量、全局变量与环境变量#
- 原理草图(变量作用域与继承):
- 局部变量(local):仅在函数内可见,离开函数即失效
- 全局变量(脚本变量):在当前脚本内可见,函数内也可访问
-
环境变量(export):可被子进程继承,适用于全局配置
-
完整示例(保存为
/tmp/vars_scope.sh):
#!/usr/bin/env bash
global_var="global_value"
export env_var="env_value"
func() {
local local_var="local_value"
echo "[func] local_var=$local_var"
echo "[func] global_var=$global_var"
echo "[func] env_var=$env_var"
}
func
echo "[main] global_var=$global_var"
echo "[main] env_var=$env_var"
# 子进程读取环境变量
bash -c 'echo "[child] env_var=$env_var"; echo "[child] global_var=$global_var"'
- 执行与预期输出:
bash /tmp/vars_scope.sh
# [func] local_var=local_value
# [func] global_var=global_value
# [func] env_var=env_value
# [main] global_var=global_value
# [main] env_var=env_value
# [child] env_var=env_value
# [child] global_var=
- 命令解释:
local:声明局部变量export:导出环境变量供子进程继承bash -c '...':启动子进程并执行命令
3. 命名规范与最佳实践#
- 使用字母、数字和下划线,避免特殊字符
- 避免数字开头
- 推荐采用全大写表示环境变量:
APP_HOME - 普通变量建议小写或驼峰:
log_dir、appName - 避免与系统保留变量冲突(如
PATH、HOME、USER) -
变量名应具备语义性,易读易维护
-
不推荐与推荐对比示例:
# 不推荐
1port=8080
my-path="/opt/app"
# 推荐
app_port=8080
app_path="/opt/app"
export APP_ENV="prod"
4. 作用域与继承要点#
- 脚本内定义的变量默认是全局变量
local只在函数内部生效export才能让子进程读取变量- 使用
unset可删除变量:
#!/usr/bin/env bash
log_dir="/var/log/app"
echo "before unset: $log_dir"
unset log_dir
echo "after unset: ${log_dir:-<empty>}"
- 预期输出:
before unset: /var/log/app
after unset: <empty>
5. 运维场景示例(带命令解释与排错)#
- 场景:设置应用环境变量并启动服务
#!/usr/bin/env bash
export APP_ENV="staging"
export APP_PORT=8080
export APP_HOME="/opt/myapp"
echo "ENV=$APP_ENV PORT=$APP_PORT HOME=$APP_HOME"
# 假设应用读取环境变量
APP_HOME/bin/start.sh
- 关键命令解释:
export APP_ENV:设置子进程可继承的环境变量-
APP_HOME/bin/start.sh:示例启动脚本 -
排错:子进程读不到变量
#!/usr/bin/env bash
APP_ENV="staging"
bash -c 'echo "child env=$APP_ENV"'
- 现象:输出为空
- 原因:未
export - 修复:
#!/usr/bin/env bash
export APP_ENV="staging"
bash -c 'echo "child env=$APP_ENV"'
- 场景:函数内临时变量检查端口
#!/usr/bin/env bash
check_port() {
local port=$1
ss -lntp | grep ":$port" || echo "port $port not listening"
}
check_port 8080
- 命令解释:
ss -lntp:查看监听端口与进程grep ":$port":过滤指定端口
6. 练习#
- 编写脚本
env_test.sh,在父脚本中定义变量X=1,子进程打印X,观察是否能打印成功,并给出修复方案。 - 编写函数
make_tmp(),使用local创建临时目录路径变量,打印后在函数外访问该变量,验证作用域效果。 - 使用
unset删除变量APP_ENV,并通过${APP_ENV:-default}输出默认值。