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'
相似线程:
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'