文件名中的通配符在我的 shell 脚本中一直失败

文件名中的通配符在我的 shell 脚本中一直失败

设想:我正在登录 docker 容器来恢复 mongodb 转储。该卷中只有一个转储文件。

如果我在文件名中使用通配符,则会出现以下错误,但如果我给出完整的文件名,它就可以工作。我花了几个小时搜索论坛但找不到答案。我的脚本中缺少什么?

root@141782f66c37:/data/backup# ./mongoretore.sh
./mongoretore.sh: line 2: dump_06-11-2020_20-32-15.dump: command not found
./mongoretore.sh: line 2: `*.dump`: ambiguous redirect

在职的

#!/bin/bash
mongorestore --drop --archive < dump_06-11-2020_20-32-15.dump

不工作

#!/bin/bash
mongorestore --drop --archive < `*.dump`

答案1

... < `*.dump`

这里重定向运算符后面的部分是命令替换,最好使用更现代的语法编写,如$(*.dump).它的内部是一个贝壳球。 glob 扩展所有以 结尾的文件名.dump,然后将它们作为命令运行。

在您的情况下,如果它是唯一匹配的文件,则生成的命令dump_06-11-2020_20-32-15.dump本身为 ,如果有其他文件,则其后带有其他文件名。无论如何,您的PATH命令都不包含具有该名称的命令,因此 shell 会给出错误。然后它会给出另一个错误,因为重定向失败。可能是因为命令替换输出一个空字符串,所以就像做

x=
... < $x

现在的问题是,你想做什么?通常,您不会尝试使用普通的命令来运行工作目录中的文件*,因为当前目录通常不位于 中PATH,因此它不起作用。如果您只想读取已知名称的文件,则正确的语法是不带反引号,例如

... < filename.dump

或者,如果您不知道文件名,但知道只有一个文件名,则可以使用 glob:

... < *.dump

只要目录中只有一个匹配的文件,这一功能就可以工作。如果超过了,它会给出一个ambiguous redirect错误,因为 Bash 无法知道你想从哪一个读取。

如果有多个文件,您需要决定如何处理它们。为每个文件运行一次命令,并依次从每个文件重定向输入?或者总共只运行该命令一次,并从其中一个文件重定向输入?但哪一个呢?

相关内容