变量与环境
Shell 变量全是字符串。赋值、引号、替换、作用域四件事决定了它们怎么工作。
赋值
- 等号两边不能有空格:
foo=bar foo = bar会执行foo,参数是=和bar- 变量名区分大小写
引号
| 写法 | 变量展开 | 保护切词 | 场景 |
|---|---|---|---|
'...' | 否 | 是 | 字面量 |
"..." | 是 | 是 | 带空格的变量 |
$'...' | 否 | 是 | \n、\t |
\x | 否 | 单字符 | 转义 |
bash
echo '$foo' # $foo
echo "$foo" # bar替换
| 写法 | 作用 |
|---|---|
$(cmd) | 命令输出替换,去掉末尾换行 |
<(...) | 输出变成临时文件路径 |
=(...) | 直接给临时文件名 |
${var} | 划清变量名边界 |
bash
diff <(ls src) <(ls docs)适合只接受文件参数、不读 stdin 的程序。
环境变量
| 命令 | 作用 |
|---|---|
printenv | 列出环境 |
export VAR=x | 加入环境,子进程继承 |
unset VAR | 删除 |
TZ=Asia/Tokyo date | 只对这条命令生效 |
env -i | 清空环境再执行 |
大写命名只是约定。$HOME、$PATH 说明环境变量的价值:隐式配置,不需要额外参数;代价是隐式依赖。
作用域
| 写法 | 影响范围 |
|---|---|
foo=bar | 当前 Shell |
export foo=bar | 当前 Shell + 子进程 |
( ... ) | 子 Shell,改动不出去 |
source file | 当前 Shell |
./file | 新进程,改动不出去 |
local x | 函数内 |
bash
(cd /tmp; pwd) # 外层目录不变
source venv/bin/activate