LabHub
学习 学习路径 课程

Shell 脚本

变量展开不是字符串替换

在 LabHub 中继续学习

一句话总结

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[@]}"

"$@"