我想自动化rsyncing,并尝试了以下代码:
TARGET="/media/USB\ DISK/Backup/"
rsync -av --delete ~/Data ${TARGET}
但执行会导致以下错误:
rsync: link_stat "/media/USB\" failed: No such file or directory (2)
rsync: mkdir "/home/DISK/BACKUP" failed: No such file or directory (2)
因为目标文件名中的“空格”。但是,当我echo
命令我可以使用它直接在shell上运行。
如何正确地做到(哪个括号,反斜杠或没有?)以及为什么?
答案 0 :(得分:10)
有两种可能性:
TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "${TARGET}"
或
TARGET=/media/USB\ DISK/Backup/
rsync -av --delete ~/Data "${TARGET}"
第一个通过引用整个字符串来保留空间。第二个用反斜杠转义它来保留空间。此外,需要引用rsync
命令的参数。
当字符串都是双引号且空格前面有反斜杠时,如TARGET="a\ b"
中所示,结果是TARGET
包含一个字面反斜杠,这可能不是你想要的。有关详细信息,请参阅man bash
中标题为“引用”的部分。
答案 1 :(得分:0)
你应该在字符串周围使用引号。字符串应该在声明和使用/调用时引用。
引用的第一个功能是允许单词包含这些 元字符强>
引用的第二个目的是阻止word splitting和 通配强>
有关详细信息,请阅读Types of quoting section。
单引号之间的所有内容都是 literal 并扩展为单个引号 字
允许shell 解析其内容以获取这些类型的扩展 带有
$
符号的前缀 - 参数扩展,算术 扩展和命令替换,同时处理所有其他内容 作为文字[...]
$'…'
和$"…"
那些是非POSIX(由Bash,Ksh93等支持):
$'…'
:允许使用/展开反斜杠转义序列(\n
,\t
等); $"…"
:用于翻译答案 2 :(得分:0)
试试这个。我认为花括号(参数扩展)搞砸了。
TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "$TARGET"