bash – 忽略变量内的引号

前端之家收集整理的这篇文章主要介绍了bash – 忽略变量内的引号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从这样的变量传递一个参数到rsync:
  1. myopts='-e "ssh -p 1234" -a'
  2. rsync $myopts 192.168.0.1:/a /a

出于某种原因,这不起作用.我甚至找到了this webpage,它说它不起作用:

  1. ### NO NO NO: this passes three strings:
  2. ### (1) "my
  3. ### (2) multiword
  4. ### (3) argument"
  5. MYARG="\"my multiword argument\""
  6. somecommand $MYARG
  7.  
  8. ### THIS IS NOT (!!!!) THE SAME AS ###
  9. command "my multiword argument"
  10.  
  11. ### YOU NEED ###
  12. MYARG="my multiword argument"
  13. command "$MYARG"

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

包含rsync调用的脚本被许多其他脚本使用,因此我只能以兼容的方式更改它.无法解决解决方案是使用数组:

  1. myopts=('-a' '-v' '-z') # new way,would work
  2. myopts='-a -v -z' # old way,breaks
  3. rsync "${myopts[@]}" 192.168.0.1:/a /a

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

在变量扩展之后,唯一的处理是字拆分和通配符扩展(如果变量在双引号内,这些都不会完成),而不是引用处理.如果要重做命令行解析的所有步骤,则需要使用eval:
  1. eval "rsync $MYOPTS 192.168.0.1:/a /a"

猜你在找的Bash相关文章