双引号引用变量是避免shell解析错误的底线;赋值等号两侧禁空格;拼接用${VAR}防歧义;遍历文件名须规避$(ls)空格分割;传参和函数内参数均需加引号。

直接加双引号是最简单也最有效的做法。只要变量值可能含空格、制表符、星号、美元符等特殊字符,就该用 "$VAR" 或 "${VAR}" 引用,这是避免绝大多数问题的底线。
变量赋值时必须避开空格
赋值语句中等号两侧绝对不能有空格,否则 shell 会尝试执行一个命令:
-
错误写法:
name = "John Smith"→ 报错name: command not found -
正确写法:
name="John Smith"(零空格)
引用变量时优先用 ${VAR} 形式
花括号明确界定变量边界,防止拼接歧义:
- 假设
dir="/tmp",想拼出/tmp/log:"$dir/log"可能被误解析为变量dir/log;
正确写法是"${dir}/log" - 多个变量拼接更需花括号:
"${user}_${host}.conf",否则$user_$host.conf会被当成两个变量名
遍历含空格文件名要用安全方式
别用 for file in $(ls ...),它按空格分割输出,会把 my document.txt 拆成两个“文件”:
- 推荐写法一(直接 glob):
for file in /path/to/*; do echo "$file"; done - 推荐写法二(临时设 IFS):
IFS=$'\n'; for file in $(ls /path/to/); do echo "$file"; done; unset IFS - 推荐写法三(find + while):
find /path/to/ -type f -print0 | while IFS= read -r -d '' file; do echo "$file"; done
传参和函数调用也要带引号
位置参数传递含空格内容时,调用处必须加引号,否则只取第一个单词:
-
错误调用:
myfunc a where a=b and c=d→$2只是where -
正确调用:
myfunc a "where a=b and c=d"→$2完整接收 - 函数内部也应始终用
"$2"或"${2}"引用,不裸写$2


















