【问题标题】:How do you assign lines of output containing spaces to a bash array [duplicate]如何将包含空格的输出行分配给bash数组[重复]
【发布时间】:2016-03-14 04:10:28
【问题描述】:

我想将可能包含空格的元素行返回到 bash 数组的输出,每行都有自己的数组元素。

例如:

find . -name \*.jpg

... 可能会返回文件名列表。我希望将每个文件名分配给一个数组。简单的解决方案一般都行不通,因为如果文件名中有空格,单词会得到自己的数组元素。

例如,从目录中的文件列表开始:

FILE1.jpg
FILE2.jpg
FILE WITH SPACES.jpg

试试:

FILES=( $(find . -name \*.jpg) )

你会得到(添加以强调单个元素):

$ for f in "${FILES[@]}"; do echo "<$f>"; done
<./FILE>
<WITH>
<SPACES.jpg>
<./FILE1.jpg>
<./FILE2.jpg>

这可能不是你想要的。

如何为数组元素分配行而不考虑包含空格的行?

【问题讨论】:

  • 好的;继续删除它,然后。我认为我可以通过提供一种不使用 -print0 的方法来增加一些价值,但没关系。还是谢谢。

标签: arrays bash


【解决方案1】:

在分配之前设置 IFS。这允许 bash 通过仅使用“\n”作为分隔符来忽略空格:

IFS=$'\n'
FILES=( $(find . -name \*.jpg) )

现在你得到了结果:

for f in "${FILES[@]}"; do echo "<$f>"; done
<./FILE WITH SPACES.jpg>
<./FILE1.jpg>
<./FILE2.jpg>

请注意,访问数组的方式也很重要。这包含在一个类似的问题中:BASH array with spaces in elements

【讨论】:

  • 这不是完全正确的。它不适用于本身包含换行符的文件名。当文件名包含诸如*? 之类的模式元字符时,它也可能不起作用。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2011-01-19
相关资源
最近更新 更多