linux Shell变量默认局部、无类型,赋值等号两侧不可有空格,引用需加$;export导出为环境变量供子进程继承,函数内用local声明局部变量,双引号内可展开变量而单引号不可。

Linux Shell 中的变量用法看似简单,但作用域和赋值规则常被误解,尤其在脚本调试时容易出错。关键在于:变量默认是局部的、无类型、赋值不加空格、引用需加 $ 符号,且子 shell 无法修改父 shell 的变量。
变量定义与赋值的基本规则
Shell 变量赋值时,等号两侧**不能有空格**,否则会被解释为命令执行:
- 错误写法:
name = "Alice"→ 报错:name: command not found - 正确写法:
name="Alice"或name=Alice(无空格、无引号也可,但含空格或特殊字符必须加引号) - 变量名只能含字母、数字和下划线,且不能以数字开头,如
user1合法,1user非法 - 赋值后不声明类型,值就是字符串;数值运算需用
$((...))或let显式处理
变量作用域:本地 vs 全局(环境变量)
默认定义的变量只在当前 shell 进程中有效;要让子进程(如执行的脚本、管道中的命令)也能访问,必须用 export 导出为环境变量:
-
PATH="/usr/local/bin:$PATH"→ 修改当前 shell 的 PATH,但子进程看不到 -
export PATH→ 将 PATH 导出,后续启动的命令、子 shell 均继承该值 -
export TMPDIR="/tmp/myapp"→ 定义并导出一步完成 - 子 shell(如
(echo $name))可读取父 shell 的变量,但修改后不影响父 shell —— 这是 fork 机制决定的隔离性
局部变量:函数内定义的变量默认不污染外部
在函数中直接赋值的变量,默认仍是全局的。如需真正局部化,必须显式使用 local 关键字(仅 bash/Zsh 支持):
-
myfunc() { count=10; echo $count; }→ 函数外也能访问$count -
myfunc() { local count=10; echo $count; }→count仅在函数内有效,退出即销毁 -
local必须在函数内部第一层使用,不能在子命令或条件分支中单独声明
引用变量:何时加 $,何时不加?
变量定义(赋值)时不加 $,引用(取值)时必须加;但某些上下文会自动展开,容易混淆:
- 赋值:
user="bob"(不加$) - 引用:
echo $user或echo "${user}"(推荐加花括号,避免歧义如${user}file) - 在双引号中仍可展开:
msg="Hello $user"→ 正确;单引号中则原样输出:'Hello $user'→ 输出字面量 - 命令替换中:
now=$(date),等号右边是命令,左边变量名不加$