如何在脚本中为rsync的可选参数正确添加引号
解决rsync可选参数(含空格路径)的适配问题
最优方案:使用bash数组构建参数列表
bash数组能完美处理带空格的路径,且空参数不会被错误传递,后续扩展其他可选参数也非常方便:
#!/bin/bash src='/home/x/ll ll' d1='/home/x/rsy nc/a' d2='/home/x/rsy nc/b' # 初始化必选参数数组 rsync_args=(-a) # 可选的--link-dest参数:仅当路径非空时添加 link_dest='/home/x/rsy nc/a' if [[ -n "$link_dest" ]]; then rsync_args+=(--link-dest="$link_dest") fi # 添加源和目标路径 rsync_args+=("$src" "$d2") # 执行rsync rsync "${rsync_args[@]}"
当link_dest为空时,数组不会添加任何额外元素,rsync只会接收到-a、源路径、目标路径,完全符合预期;当路径含空格时,数组会保留完整的路径作为单个参数,不会被bash拆分。
为什么之前的尝试失败
- Try 1:未用引号包裹
$x1"$x2",bash会将带空格的路径拆分成多个参数,且空值时会传递空字符串给rsync,被误判为源路径。 - Try 2:将引号写入变量内容中,bash不会将其解析为引号,而是当作路径的一部分,导致rsync查找不存在的路径。
备选方案:使用eval(适合习惯字符串拼接的场景)
如果偏好字符串拼接的方式,可借助eval解析引号,注意仅在可控环境下使用(避免恶意输入):
#!/bin/bash src='/home/x/ll ll' d1='/home/x/rsy nc/a' d2='/home/x/rsy nc/b' rsync_cmd="rsync -a" link_dest='/home/x/rsy nc/a' if [[ -n "$link_dest" ]]; then rsync_cmd+=" --link-dest=\"$link_dest\"" fi rsync_cmd+=" \"$src\" \"$d2\"" eval "$rsync_cmd"
eval会将字符串中的双引号解析为shell引号,确保带空格的路径被正确识别。
内容的提问来源于stack exchange,提问作者Reg
相关产品推荐
相关产品推荐

