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

745
stackunderflow

Я выбираю 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 "$" 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! 
4
Потому что ваш массив содержит только один элемент. Попробуйте `echo" $ {# NEMO_SCRIPT_SELECTED_FILE_PATHS [@]} "`, чтобы увидеть, сколько элементов в массиве. Пожалуйста, покажите, как вы заполняете этот массив. glenn jackman 7 лет назад 2
Хорошая работа, цитируя все ваши переменные. Слишком часто мы этого не видим. glenn jackman 7 лет назад 0

1 ответ на вопрос

6
glenn jackman

Предполагая, что:

  • переменная окружения $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" "$" >>file one >>file two >>file three 

mapfile это встроенная команда bash, которая читает стандартный ввод, разбивает на новые строки и сохраняет строки в именованном массиве.

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