Shell 入门:引用变量并保留带空格的任务名
通过循环和函数传参观察双引号如何保留完整参数,避免空格拆词与通配符展开破坏任务名称。
本节目标
通过循环和函数传参观察双引号如何保留完整参数,避免空格拆词与通配符展开破坏任务名称。
环境与运行方法
使用 Bash 3.2 及以上,保存为 lesson.sh,执行 bash -n lesson.sh 检查语法,再运行 bash lesson.sh。不要使用 sh 替代 Bash,本组使用部分 Bash 专有语法。
核心思路
Shell 变量展开后可能发生拆词和通配符扩展。传递普通文本时应使用双引号,字面文本不需要变量替换时可以使用单引号。参数边界决定脚本到底操作哪些对象。
完整示例
show_task() {
printf 'args=%s title=%s\n' "$#" "$1"
}
for title in 'review notes' 'practice code'; do
show_task "$title"
done预期输出
args=1 title=review notes
args=1 title=practice code逐步理解
循环依次取得两个包含空格的完整任务名,调用函数时保持引用,函数因此每次只接收一个参数,$# 都是 1。printf 的格式固定,任务内容放在后续参数,不会被当成格式说明符。
函数仅使用第一个参数,真实工具还应验证参数数量。Shell 适合组合命令,但文本边界不能含糊。某段脚本在没有空格的文件名上成功,并不能证明它适合所有实际路径。
常见问题与边界
- 不加引号的展开可能拆成多个参数。
- 外部文本不应直接作为 printf 格式。
- 单引号不会展开变量,与双引号有不同用途。
动手练习
把任务名改成包含星号的文本,再观察输出。
参考答案
正确引用时星号原样保留,不会变成目录中的文件名。去掉引号可能让结果随当前目录改变,这通常不是任务名称的预期含义。
文章回复
0 条公开回复