使用通配符读取字符串时出现奇怪的 bash 行为
wierd bash behavior when reading string with wildcard
我正在使用 bash 4.2 开发 centOS 7,我看到了奇怪的行为。
这是我尝试做的事情:
我有一个脚本可以复制模板并将索引名称添加到新文件,如下所示:
原始文件夹:
- 文件 1
- 文件2
至:
- 文件 1
- 文件2
- index.file1
- index.file2
此外,脚本会创建一个存储索引名称的 tmp 文件。
我想要做的是最终通过 curl 加载和发送(单独)所有名称开头带有索引名称的文件。
问题从哪里开始?当索引中有通配符时。
假设索引名称是 INDEX*。
新文件是:
- 文件 1
- 文件2
- INDEX*.file1
- INDEX*.file2
- tmp(猫 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 将字符串分成单独的字符串?
任何帮助将不胜感激...
谢谢!
Use More Quotes™:如果您引用 echo
的参数,则 glob 不会展开。
我正在使用 bash 4.2 开发 centOS 7,我看到了奇怪的行为。 这是我尝试做的事情:
我有一个脚本可以复制模板并将索引名称添加到新文件,如下所示:
原始文件夹:
- 文件 1
- 文件2
至:
- 文件 1
- 文件2
- index.file1
- index.file2
此外,脚本会创建一个存储索引名称的 tmp 文件。 我想要做的是最终通过 curl 加载和发送(单独)所有名称开头带有索引名称的文件。
问题从哪里开始?当索引中有通配符时。 假设索引名称是 INDEX*。 新文件是:
- 文件 1
- 文件2
- INDEX*.file1
- INDEX*.file2
- tmp(猫 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 将字符串分成单独的字符串?
任何帮助将不胜感激...
谢谢!
Use More Quotes™:如果您引用 echo
的参数,则 glob 不会展开。