You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在脚本中为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:25:21