【问题标题】:wierd bash behavior when reading string with wildcard使用通配符读取字符串时出现奇怪的 bash 行为
【发布时间】:2018-05-17 09:14:33
【问题描述】:

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

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

原始文件夹:

  • 文件1
  • 文件2

到:

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

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

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

  • 文件1
  • 文件2
  • 索引*.file1
  • 索引*.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 个元素 = 完整的字符串...

我猜索引名称中的通配符是导致问题的原因,所以有人知道解决方法吗?

我认为可以在不使用通配符的情况下将索引名称保存在 tmp 中,然后只加载名称中包含 INDEX 的所有文件,但这是有风险的 - 主要是因为我不能保证通配符总是在 INDEX结束。

那我该怎么办?

有没有办法让 bash 明白在这种情况下“*”应该被视为字符串而不是通配符?

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

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

谢谢!

【问题讨论】:

    标签: string bash wildcard


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但它会回显变量中准确保存的内容(当我使用引号时)还是仅更改“echo”命令?
    • 它在将输入传递给echo 命令之前改变了shell 解释输入的方式。请点击链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2012-08-15
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多