我想将一个参数从这样的变量传递给 rsync:

myopts='-e "ssh -p 1234" -a'
rsync $myopts 192.168.0.1:/a /a

出于某种原因,这不起作用。我什至发现 this webpage 说它不起作用:
### NO NO NO: this passes three strings:
###      (1)  "my
###      (2)  multiword
###      (3)  argument"
MYARG="\"my multiword argument\""
somecommand $MYARG

### THIS IS NOT (!!!!) THE SAME AS ###
command "my multiword argument"

### YOU NEED ###
MYARG="my multiword argument"
command "$MYARG"

不幸的是,它没有说明为什么它不起作用。

包含 rsync 调用的脚本被很多其他脚本使用,所以我只能以兼容的方式更改它。一个不起作用的解决方案是使用数组:
myopts=('-a' '-v' '-z') # new way, would work
myopts='-a -v -z'       # old way, breaks
rsync "${myopts[@]}" 192.168.0.1:/a /a

变量中的选项被完全忽略。

最佳答案

在变量扩展之后,唯一完成的处理是分词和通配符扩展(如果变量在双引号内,则这些都不会完成),而不是引号处理。如果您希望重做命令行解析的所有步骤,则需要使用 eval:

eval "rsync $MYOPTS 192.168.0.1:/a /a"

关于bash - 变量内的引号被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17456747/

10-10 17:53
查看更多