我想将一个参数从这样的变量传递给 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/