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_dirappName
  • 避免与系统保留变量冲突(如 PATHHOMEUSER
  • 变量名应具备语义性,易读易维护

  • 不推荐与推荐对比示例:

# 不推荐
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. 练习#

  1. 编写脚本 env_test.sh,在父脚本中定义变量 X=1,子进程打印 X,观察是否能打印成功,并给出修复方案。
  2. 编写函数 make_tmp(),使用 local 创建临时目录路径变量,打印后在函数外访问该变量,验证作用域效果。
  3. 使用 unset 删除变量 APP_ENV,并通过 ${APP_ENV:-default} 输出默认值。