跳到正文

变量与环境 ​

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