Shell变量存储目录路径时,引号内引用其子目录的正确写法是什么
Shell变量拼接路径写法正误判断
问题描述
给定变量:target=/dir
现在要在rsync命令中指向该变量对应目录下的子文件夹,也就是要实现和以下命令完全一致的效果:rsync "/source/" "/dir/subdir"
请问以下两种写法哪一个是正确的?
- 写法1:
rsync "/source/" "$target"/subdir - 写法2:
rsync "/source/" "$target/subdir"
解答
结论
第二种写法是通用的正确写法。
原因解释
- Shell中双引号的核心作用是将包裹内容作为单个参数传递,避免内部的空格、特殊字符被Shell拆分为多个参数,同时不会影响引号内部的变量正常展开。
- 写法1仅把变量
$target放在双引号内,当$target不含空格、后续子目录名也没有特殊字符时,运行结果和写法2看起来一致,但存在明显的适配漏洞:如果$target本身包含空格,或者后续的子目录路径存在空格、通配符等特殊字符,引号外的部分会被Shell拆分,导致命令接收的路径参数错误。 - 写法2将完整的拼接路径全部放在双引号内,不管是变量部分还是后面的固定子目录部分存在特殊字符,都会被识别为单个完整的路径参数传递给rsync,覆盖所有合法路径的使用场景,是更规范安全的写法。
示例验证
如果变量设置为带空格的路径:target="/home/用户/工作目录",要指向的子目录为2024年项目资料:
- 写法1展开后会被拆分为
/home/用户/工作目录/2024年、项目资料两个无效参数,命令执行失败 - 写法2展开后会传递完整路径
/home/用户/工作目录/2024年项目资料,命令执行正常
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

