Bash 字符串连接用于构建参数列表

Bash 字符串连接用于构建参数列表

鉴于这一点:

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}"'

相关内容