![Bash 字符串连接用于构建参数列表](https://linux22.com/image/54867/Bash%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9E%E6%8E%A5%E7%94%A8%E4%BA%8E%E6%9E%84%E5%BB%BA%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8.png)
鉴于这一点:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
echo 按预期显示 PARMS 字符串,没有显示错误,但 rsync 默默地运行,就好像 += 添加的选项不存在一样。然而,这按预期工作:
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
我想我用 bash 引号搞砸了一些东西(总是有问题),但不确定什么以及为什么选项被忽略,即使字符串似乎已经正确构建。
答案1
两者之间存在差异:
PARMS+="... --exclude='.git'"
和
... --exclude='.git'
在第一个中,单引号本身就是内引号,所以他们确实存在rsync
在作为参数给出的替换文本中。rsync
获取一个值为 的参数--exclude='.git'
。在第二个中,单引号在写入时由 shell 解释,因为它们不是里面引号本身,并且rsync
可以看到--exclude=.git
.
在这种情况下,您根本不需要单引号 -.git
本身就是一个完全有效的 shell 单词,没有特殊字符,因此您可以在命令中按字面意思使用它。
不过,对于这种事情更好的是大批:
PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"
这会将您的命令构建为单独的单词,并在编写数组行时使用您想要解释的任何引用。"${PARMS[@]}"
扩大将数组中的每个条目作为单独的参数,即使参数本身包含特殊字符或空格,因此请rsync
按照您的意思查看您所写的内容。
答案2
此外@迈克尔·霍默的回答, 您可以使用bash
评估函数:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'