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

sta*_*low 4 bash nautilus array nemo

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

(正如您在glenn jackman下面的答案中所见,NEMO_SCRIPT_SELECTED_FILE_PATHS包含一个以换行符分隔的文件路径列表。)

为什么是“是啊!” 不是在每个文件路径行之后打印?我怎样才能做到这一点?(这个问题可能很烦人,因为我最初认为这个文件路径列表是一个数组,但显然不是。)

脚本

#!/bin/bash

for i in "${NEMO_SCRIPT_SELECTED_FILE_PATHS[@]}"
do
    echo "$i"
    echo "Yeah!"
done
Run Code Online (Sandbox Code Playgroud)

输出

/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!
Run Code Online (Sandbox Code Playgroud)

gle*_*man 8

假设:

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

您可以将其解析为一个 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
Run Code Online (Sandbox Code Playgroud)

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

如果您的任何文件名包含换行符(这是合法的文件名字符),则会中断。