类似的线程:
How can I escape a double quote inside double quotes?
我有一个带有GNU的freebsd盒,版本为4.4.0(0)-release。
在此框中有一个运行rsync的shell脚本,此脚本需要指定一个具有空间的rsync路径参数。
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"
发布于 2022-04-01 09:21:16
您的rsync命令似乎是分词的。不能将完整命令存储在变量中,必须使用数组:
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'发布于 2022-04-01 09:15:43
您必须将报价从双引号改为单引号,例如:
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中没有rsync,但是您可以看到最后一个参数,--rsync-path=sudo rsync是用单引号括起来的,因此是一个纪念碑,
https://stackoverflow.com/questions/71704508
复制相似问题