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