变量展开不是字符串替换
一句话总结
Shell 会先展开变量,再进行分词;遗漏双引号会把一个含空格的值拆成多个参数。
核心规则
变量展开通常都应放在双引号中。参数展开可以提供默认值、赋值或在缺失时立即报错,也能在不启动外部进程的情况下处理路径和字符串。条件测试中,POSIX 方括号适用于 sh,双方括号是更安全的 Bash 扩展,双圆括号用于算术。
环境变量是部署配置的标准入口。成功结果写 stdout,错误和用法写 stderr;退出码应在项目内保持一致。双方括号和赋值右侧不会分词,但把不可信字符串交给 eval 或 bash -c 时,引号无法阻止代码执行。参数列表应使用 Bash 数组保存并安全展开。
原文命令与标识符
file="/var/log/nginx/access.log"
${file##*/} # access.log (앞에서 최장 매칭 제거 = 경로 떼기)
${file%.*} # /var/log/nginx/access (뒤에서 최단 매칭 제거 = 확장자 떼기)
${file%.log}.bak # /var/log/nginx/access.bak
${VER^^} # 대문자로
${var//old/new} # 전부 치환
My Report.pdf
My
Report.pdf
rm $FILE
$FILE
rm "$FILE"
${VAR:-기본값}
${VAR:=기본값}
${VAR:?메시지}
local name="${1:?사용법: deploy.sh <앱이름>}"
echo | sed
[ ... ]
sh
[[ ... ]]
=~
(( ... ))
(( retries > 3 ))
-f
-d
-s
-r
-x
-e
-e
-f
: "${LOG_LEVEL:=info}"
result=$(script.sh)
[[ ... ]]
[[ -n $VAR ]]
VAR=$OTHER
eval
bash -c
$(...)
awk
"${ARGS[@]}"
"$@"