Как отобразить один элемент массива, который разделен символами новой строки, в новый массив с несколькими элементами
Я выбираю 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, которая читает стандартный ввод, разбивает на новые строки и сохраняет строки в именованном массиве.
Это ломается, если любое из ваших имен файлов содержит символы новой строки (что является допустимым символом имени файла).