Как отобразить один элемент массива, который разделен символами новой строки, в новый массив с несколькими элементами

Я выбираю 4 файла в Nemo в пути /home/myUsername/.local/share/nemo/scripts/Folder with spaces/, Nemo хранит пути к файлам в переменной окружения NEMO_SCRIPT_SELECTED_FILE_PATHS,

(Как вы можете видеть в ответе от glenn jackman ниже, NEMO_SCRIPT_SELECTED_FILE_PATHS содержит разделенный новой строкой список путей к файлам.)

Почему "Да!" не печатается после каждой строки пути к файлу? Как я могу этого достичь? (Этот вопрос, возможно, раздражает, потому что я изначально думал, что этот список путей к файлам является массивом, который, очевидно, не является.)

SCRIPT

#!/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 каким-то волшебным образом настроен для вас Немо, и
  • он содержит разделенный новой строкой список имен файлов,

вы можете разобрать его в массив 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, которая читает стандартный ввод, разбивает на новые строки и сохраняет строки в именованном массиве.

Это ломается, если любое из ваших имен файлов содержит символы новой строки (что является допустимым символом имени файла).

Другие вопросы по тегам