安全引用含空格变量的关键是全程防断开:赋值时必须用双引号(如name="John Smith"),引用时用"${VAR}"包裹(如"${file}.bak"),传参时命令参数全引起来(如cp "${src}" "${dst}"),子shell中优先显式传参而非依赖export。

安全引用包含空格的变量,关键不是“怎么引”,而是“从赋值到引用全程防断开”。空格本身不危险,危险的是 shell 把它当参数分隔符——一旦变量值含空格又没被妥善包裹,命令就碎成多个片段,轻则报 command not found,重则误删、误覆盖。
赋值时:有空格就必须加引号
哪怕只是 name="John Smith" 这样一行,双引号也不能省。单引号也行,但会禁用变量和命令替换;日常推荐双引号,兼顾安全与灵活性。
-
正确:
file="my report.pdf"、path="/tmp/my data" -
错误:
file=my report.pdf→ shell 认为要执行命令my,参数是report.pdf,直接报错
引用时:一律用 ${VAR} + 双引号包裹
写成 "$file" 看似够用,但遇到拼接场景极易出错。比如 "$file.bak" 实际查的是变量 file.bak(不存在),而不是 $file 的值加 .bak。必须用花括号明确边界:
-
安全写法:
"${file}.bak"、"${dir}/log.txt"、"${user}_${host}.conf" -
避免裸写:
$file.bak、$dir/log.txt—— 看似省事,实则埋雷
传给命令时:确保整个参数不被拆开
像 cp、mv、find 这类接受路径的命令,变量一露出来就得裹紧:
-
cp "${src}" "${dst}"—— 两边都引,哪怕变量本身不含空格也养成习惯 -
find /home -name "${pattern}"—— 避免pattern="*.txt"被提前展开 - 循环处理文件名?别用
for f in $(ls),改用while IFS= read -r f或find ... -print0 | xargs -0
进阶提醒:子进程看不见未导出的变量
如果要在 bash -c 'echo "$file"' 这类子 shell 中用变量,光赋值不够,还得 export file。不过更稳妥的做法是显式传参:
-
bash -c 'echo "$1"' _ "${file}"—— 把值作为位置参数传进去,不依赖环境变量 - 脚本间传递?优先用参数或标准输入,少靠全局变量











