[英]How to handle space in filename in bash script?
我想自动化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上运行。
如何正确地做(哪个括号,反斜杠或没有?)以及为什么?
有两种可能性:
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
标题为“引用”的部分。
你应该在你的字符串周围使用引号 。 字符串应在声明和使用/调用时引用 。
引用的第一个功能是允许单词包含这些元字符 。
引用的第二个目的是防止单词拆分和通配 。
有关详细信息,请参阅引用类型部分 。
单引号之间的所有内容都是文字的,并扩展为单个单词
允许shell 解析那些以
$
sign为前缀的扩展类型的内容 - 参数扩展,算术扩展和命令替换,同时将所有其他内容视为文字[...]
$'…'
和$"…"
那些是非POSIX(由Bash,Ksh93等支持):
$'…'
:允许使用/扩展反斜杠转义序列( \\n
, \\t
等); $"…"
:用于翻译 试试这个。 我认为花括号(参数扩展)搞砸了。
TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "$TARGET"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.