我从互联网上劫持了一个非常简洁的备份脚本,但是在某个地方发生了这样的事情
DIRS="/home/ /var/www/html /etc"
tar -czf /backup/file.tar.gz "${DIRS}"
这恰好在我的机器上运行良好,但在我的服务器上它似乎认为它是一条路径并告诉我它不存在:
/bin/tar: /home/ /var/www/html /etc: Cannot stat: No such file or directory
/bin/tar: Exiting with failure status due to previous errors
本地 tar 版本是 1.29 而服务器是 1.28
将目录与该变量分开提供 tar 的正确方法是什么?
只要这是一个 bash 脚本(甚至是大多数版本的 sh),您就应该使用数组而不是变量来传递参数:
如果您愿意,可以这样写(如果数组变大,通常更容易阅读):
在不支持数组的 shell 中,您需要取消引用变量以允许分词(如果可以避免,则不推荐):
当您引用变量来传递这些参数时,它基本上与以下内容相同:
但是,当您将它们传递给带引号的数组时,它将更像:
将它们通过不带引号的数组或变量传递将执行类似于:
在这个例子中,这不应该是一个问题,但它会导致额外的分词和其他类型的扩展,这可能是不受欢迎的或可能有害的。
我同意 jesse_b。如果可能,请使用数组。
我只是想补充一点,最好避免使用 bash 中的所有大写变量。按照惯例,环境变量和内部 shell 变量都是大写的。最好将所有其他变量名称保持为小写,以避免覆盖重要的内容。