shell脚本中的三重嵌套引用

我想写一个shell脚本,调用另一个脚本,然后执行一个rsync命令。 第二个脚本应该在自己的terminal中运行,所以我使用gnome-terminal -e "..."命令。 这个脚本的参数之一是一个包含应该给rsync的参数的string。 我把这些单引号。 直到这里,一切正常,直到其中一个rsync参数是一个包含空格的目录path。 我尝试了很多',',','的组合,但是脚本根本不运行,或者只有path的第一部分被采用。

这是我使用的代码的一个稍微修改版本

 gnome-terminal -t 'Rsync scheduled backup' -e "nice -10 /Scripts/BackupScript/Backup.sh 0 0 '/Scripts/BackupScript/Stamp' '/Scripts/BackupScript/test' '--dry-run -g -o -p -t -R -u --inplace --delete -r -l '\''/media/MyAndroid/Internal storage'\''' " 

Backup.sh中运行这个命令

 rsync $5 "$path" 

目的地$pathStamp文本计算。

我怎样才能达到这三个层次的嵌套报价?

这些是我刚才看到的一些问题(我也尝试了其他的资源)

  • https://unix.stackexchange.com/questions/23347/wrapping-a-command-that-includes-single-and-double-quotes-for-another-command
  • 如何使嵌套的双引号生存的bash解释器?
  • 在bash中使用多个引号
  • 嵌套引号bash

我没有成功地将解决scheme应用于我的问题。

这是一个例子。 caller.sh使用gnome-terminal来执行foo.sh ,然后打印所有参数,然后用第一个参数调用rsync

caller.sh

 #!/bin/bash gnome-terminal -t "TEST" -e "./foo.sh 'long path' arg2 arg3" 

foo.sh

 #!/bin/bash echo $# arguments for i; do # same as: for i in "$@"; do echo "$i" done rsync "$1" "some other path" 

编辑:如果$1包含rsync的几个参数,其中一些是长路径,以上将不起作用,因为bash通过"$1"作为一个参数,或$1作为多个参数,拆分它,而不考虑包含引号。

有(至少)一个解决方法,你可以欺骗bash如下:

caller2.sh

 #!/bin/bash gnome-terminal -t "TEST" -e "./foo.sh '--option1 --option2 \"long path\"' arg2 arg3" 

foo2.sh

 #!/bin/bash rsync_command="rsync $1" eval "$rsync_command" 

这将在命令行上执行rsync --option1 --option2 "long path"的输入。

警告 :这个黑客引入了一个安全漏洞,如果用户对字符串内容有任何影响(例如'--option1 --option2 \"long path\"; echo YOU HAVE BEEN OWNED'将运行rsync ,然后执行 echo命令)。

您是否尝试用“\”(不包括引号)来避开路径中的空间?

gnome-terminal -t 'Rsync scheduled backup' -e "nice -10 /Scripts/BackupScript/Backup.sh 0 0 '/Scripts/BackupScript/Stamp' '/Scripts/BackupScript/test' '--dry-run -g -o -p -t -R -u --inplace --delete -r -l ''/media/MyAndroid/Internal\ storage''' "