如何将一个由换行符分隔的数组元素映射到具有多个元素的新数组中

如何将一个由换行符分隔的数组元素映射到具有多个元素的新数组中

我在路径中选择了 Nemo 中的 4 个文件/home/myUsername/.local/share/nemo/scripts/Folder with spaces/。Nemo 将文件路径存储在环境变量中NEMO_SCRIPT_SELECTED_FILE_PATHS

(正如您在下面的答案中看到的glenn jackmanNEMO_SCRIPT_SELECTED_FILE_PATHS包含一个以换行符分隔的文件路径列表。)

为什么不是每个文件路径行后都打印“Yeah!”?我该如何实现?(这个问题可能很烦人,因为我最初以为这个文件路径列表是一个数组,但显然不是。)

脚本

#!/bin/bash

for i in "${NEMO_SCRIPT_SELECTED_FILE_PATHS[@]}"
do
    echo "$i"
    echo "Yeah!"
done

输出

/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script1
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script2
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script3
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script4

Yeah!

答案1

假设:

  • 环境变量$NEMO_SCRIPT_SELECTED_FILE_PATHS以某种方式由 Nemo 神奇地为你设置,并且
  • 它包含一个以换行符分隔的文件名列表,

你可以将它解析成一个 bash 数组,如下所示:

$ NEMO_SCRIPT_SELECTED_FILE_PATHS="file one
file two
file three"

$ mapfile -t files <<<"$NEMO_SCRIPT_SELECTED_FILE_PATHS"

$ echo ${#files[@]}
3

$ printf ">>%s\n" "${files[@]}"
>>file one
>>file two
>>file three

mapfile是 bash 内置命令,它读取标准输入,在换行符处分割并将行存储在命名数组中。

如果您的任何文件名包含换行符(这是一个合法的文件名字符),则会出现这种情况。

相关内容