gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:48:50 24 4
gpt4 key购买 nike

我一直在这里和其他地方阅读有关 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/

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