Bash 双引号内的双引号 BSD

Bash double quotes inside double quotes BSD

相似线程:

How can I escape a double quote inside double quotes?

我有一个带有 GNU bash、版本 4.4.0(0)-release 的 freebsd box。

在这个盒子上有一个shell脚本运行 rsync,这个脚本需要指定一个rsync路径参数,里面有space。

dqt='"'

RSYNC="/usr/local/bin/rsync -avzn --rsync-path=${dqt}sudo rsync${dqt}"

解释器是 bash,但只是为了确保我已经专门尝试过 bash -x,这是我得到的:

+ /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"' --numeric-ids --delete ...

这当然会导致 rsync 错误:语法或使用错误。有什么解决办法吗?

运行 rsync 很好:

rsync-path="sudo rsync"

您必须将引号从双引号更改为单引号,例如:

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'

我在一个小 bash 脚本中使用了它:

#!/bin/bash -x

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'
echo "#" $RSYNC "#"

eval "$RSYNC"

结果:

+ RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
+ echo '#' /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"' '#'
# /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" #
+ eval '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
++ /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'
./x: line 6: /usr/local/bin/rsync: No such file or directory

好的,我在 /usr/local bin 中没有 rsync,但是你可以看到最后一个参数 --rsync-path=sudo rsync 包含在单引号中,因此是一个参数,

您的 rsync 命令似乎是 word-split。您不能将完整的命令存储在变量中,您必须使用数组:

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" )

"${RSYNC_ARR[@]}" # the double quotes are mandatory here

小测试看看区别:

#!/bin/bash

RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path=sudo\ rsync )

set -x

: $RSYNC
#+ : /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"'

: ${RSYNC_ARR[@]}
#+ : /usr/local/bin/rsync -avzn --rsync-path=sudo rsync

: "$RSYNC"
#+ : '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

: "${RSYNC_ARR[@]}"
#+ : /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'