繁体   English   中英

如何在bash脚本中处理文件名中的空格?

[英]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标题为“引用”的部分。

你应该在你的字符串周围使用引号 字符串应在声明和使用/调用时引用

为什么要使用报价?

元字符[1]

引用的第一个功能是允许单词包含这些元字符

单词分裂和通配[2]

引用的第二个目的是防止单词拆分和通配

报价类型

有关详细信息,请参阅引用类型部分

简单的引号(POSIX)

单引号之间的所有内容都是文字的,并扩展为单个单词

双引号(POSIX)

允许shell 解析那些以$ sign为前缀的扩展类型的内容 - 参数扩展,算术扩展和命令替换,同时将所有其他内容视为文字[...]

Bash引用$'…'$"…"

那些是非POSIX(由Bash,Ksh93等支持):

  • $'…' :允许使用/扩展反斜杠转义序列( \\n\\t等);
  • $"…" :用于翻译

参考

试试这个。 我认为花括号(参数扩展)搞砸了。

TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "$TARGET"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM