读取带有通配符的字符串时奇怪的 bash 行为



我正在开发带有 bash 4.2 的 centOS 7,我目睹了奇怪的行为。 这是我尝试做的:

我有一个脚本可以复制模板并将索引名称添加到新文件,如下所示:

原始文件夹:

  • 文件1
  • 文件2

自:

  • 文件1
  • 文件2
  • 索引文件1
  • 索引文件2

此外,该脚本还会创建一个存储索引名称的 tmp 文件。 我想做的是最终通过 curl 加载和发送(单独)所有在其名称开头带有索引名称的文件。

问题从哪里开始?当索引中包含通配符时。 假设索引名称是索引*。 新文件是:

  • 文件1
  • 文件2
  • 索引*.文件1
  • 索引*.文件2
  • tmp (cat tmp = "INDEX*")

tmp 文件只包含 INDEX*,正如我看到的,如果我在它上运行 cat。

如果我尝试将内容加载到 bash 中的变量中,如下所示:

index_name=$(<tmp)
echo index name: $index_name

结果是一个字符串,其中包含所有带有 INDEX 的文件,如下所示:

index name: INDEX*.file1 INDEX*.file2

这很奇怪,因为这不是 tmp 包含的,但我试图至少将这个字符串转换为一个数组,并且无论如何都只有我需要的文件列表。 我是这样试过的:

IFS=' ' read -a index_array <<< "$index_name"

它将字符串变成一个数组,其中 1 个元素 = 完整的字符串...

我想索引名称中的通配符是导致问题的原因,那么有谁知道任何解决方法吗?

我认为 mabye 将索引名称保存在没有通配符的 tmp 中,然后加载所有名称中包含 INDEX 的文件,但这是有风险的 - 主要是因为我无法保证通配符将一直位于 INDEX 末尾。

那我该怎么办?

有没有办法让 bash 理解在这种情况下"*"应该被视为字符串而不是通配符?

如果没有,有没有办法让 bash 将字符串分成分离的字符串?

任何帮助将不胜感激...

谢谢!

使用更多引号™:如果您引用参数来echo则不会扩展 globs。

最新更新