gpt4 book ai didi

linux - shell脚本中的三重嵌套引号

转载 作者:IT王子 更新时间:2023-10-29 01:22:49 24 4
gpt4 key购买 nike

我正在尝试编写一个 shell 脚本,该脚本调用另一个脚本,然后执行 rsync 命令。第二个脚本应该在它自己的终端中运行,所以我使用了 gnome-terminal -e "..." 命令。该脚本的参数之一是一个字符串,其中包含应提供给 rsync 的参数。我把它们放在单引号中。到这里为止,一切正常,直到 rsync 参数之一是包含空格的目录路径。我尝试了 ',',\',\' 的多种组合,但脚本要么根本不运行,要么只采用路径的第一部分。

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

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"

其中目标 $path 是根据 Stamp 中的文本计算的。

如何实现这三层嵌套引用?

这些是我刚才看的一些问题(我之前也尝试过其他来源)

我未能成功应用这些解决方案来解决我的问题。

最佳答案

这是一个例子。 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 命令)。

关于linux - shell脚本中的三重嵌套引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com