使用通配符读取字符串时的wierd bash行为

时间:2018-05-17 09:14:33

标签: string bash wildcard

我正在使用bash 4.2在centOS 7上工作,我目睹了奇怪的行为。 这是我尝试做的事情:

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

原始文件夹:

  • 文件1
  • file2的

为:

  • 文件1
  • file2的
  • index.file1
  • index.file2

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

问题出在哪里?当索引中有通配符时。 假设索引名称是INDEX *。 新文件是:

  • 文件1
  • file2的
  • INDEX * .file1
  • INDEX * .file2
  • 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将字符串分成sepreated字符串?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

Use More Quotes™:如果引用echo的参数,则不会扩展全局。