带有 eval、变量和引号的 Bash 问题

标签 bash eval rsync quoting

我一直在这里和其他地方阅读有关 bash 中的引号,但我没有得到解决这个问题的帮助。

问题是,我有一个循环执行备份的小脚本。

如果我不使用 eval,那么 rsync 中的 $OPTIONS 变量就会出现问题。

但是如果我使用 eval 那么问题就出在变量 $CURRENT_DIR...

rsync 返回以下消息:'Unexpected local arg:/path/with'

我已经尝试了各种引用变量 $CURRENT_DIR

的方法
CURRENT_DIR="/path/with spaces/backup"
DIR="dir_by_project"
f=":/home/project_in_server"
OPTIONS="-avr --exclude 'public_html/cms/cache/**' --exclude 'public_html/cms/components/libraries/cmslib/cache/**' --delete"
eval rsync --delete-excluded -i $OPTIONS  root@example.com$f $CURRENT_DIR/xxx/$DIR/files

有什么方法可以使用变量 $CURRENT_DIR 而不会出现由空格引起的问题?

最佳答案

eval rsync --delete-excluded -i $OPTIONS  root@example.com$f "\"$CURRENT_DIR/xxx/$DIR/files\""

command "some thing" 使用一个参数 some thing 执行命令。引号由 shell 解析,参数在执行命令时设置为数组。该命令会将参数视为不带引号的 some thing

eval 命令或多或少地对待它的参数,就好像它们是输入到 shell 中一样。因此,如果您 eval 命令“some thing”,bash 会使用两个参数执行 eval:commandsome thing (再次在 bash 设置参数数组时引号被吃掉)。因此,eval 然后就像您在 shell 中键入 command some thing 一样,这不是您想要的。

我所做的只是对引号进行转义,以便 bash 将 "some thing" 字面意思传递给 eval,包括引号。然后 eval 就像您键入 command "some thing" 一样。

我命令中的外引号不是严格要求的,它们只是习惯。你也可以使用:

eval rsync --delete-excluded -i $OPTIONS  root@example.com$f \"$CURRENT_DIR/xxx/$DIR/files\"

关于带有 eval、变量和引号的 Bash 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253782/

相关文章:

bash - 如何从文件名中获取字符串并将其用作参数

Javascript/我的动态函数安全吗?

c# - 具有元语言抽象的语言是否比仅使用反射 API 的语言表现更好?

linux - 重定向密码提示警报

bash - 在 Ubuntu 14.04、Unity 上的 Bash 中,如何获取打开窗口的总大小(包括边框和标题)?

Python3移植问题

python - 以dict形式访问类属性 python django

ssh - rsync主机 key 验证失败

docker - 使用rsync在分区之间复制docker镜像文件夹

java - 在 bash 命令中读取文件路径