Bash IFS ('\n'): проблемы с определением имени файла с помощью команды find и цикла for

#!/bin/bash

IFS='\n' 
declare -i count=0

AX=$(find *.iso -maxdepth 1 -type f) # Rather use AX="$(find *.iso -maxdepth 1 -type f"?
# A="${AX%x}" < Could I use this when applying "" to $() in AX? But it should already include newlines like this way. edit: I don't need the trailing newlines fix.

for iso in "$AX"
 do
  echo "Use "$iso"? [Y/N]?" # Outputs ALL files, IFS has no force somehow
  read choiceoffile
  shopt -s nocasematch
  case $choiceoffile in
  y ) echo "Using selected file.";;
  * ) continue;;
  esac
  # some sort of processing
done

Правильно ли выполнена подстановка команд? Переменная не работает с IFS \n в цикле for, я не понимаю, почему это происходит.

Предполагается, что цикл for обрабатывает имена файлов с пустым пространством, обрабатывая вывод find построчно (поэтому я использую IFS\n).


person Max Hopfgartner    schedule 08.07.2015    source источник
comment
Я не понимаю вопроса здесь. Можете ли вы объяснить больше? Почему вы перебираете .iso файлов, а затем используете find для получения .wbfs файлов? Не было бы проще просто перебрать оба и подсчитать iso-файлы и использовать массив для файлов wbfs, а затем просто использовать индексирование смещения массива, чтобы получить желаемое количество? case $image in *.iso) count+=1;; *.wbfs) files+=("$image");; esac, а затем "${files[@]:$count}"?   -  person Etan Reisner    schedule 08.07.2015
comment
Я не был достаточно быстр в редактировании. Это все $iso в простом тексте моего скрипта.   -  person Max Hopfgartner    schedule 08.07.2015
comment
Тело вопроса за пределами вашего кода должно содержать дополнительное объяснение проблемы. Есть ли исключение, или вывод/результат просто не такой, как вы ожидали? Если нет, то почему?   -  person Palu Macil    schedule 08.07.2015
comment
А что этот код не работает? Если код не соответствует тому, что у вас есть локально или что вы пытаетесь сделать, отредактируйте его и исправьте. И, пожалуйста, как более четко сказал Палу Масил, дайте нам больше описания того, что вы пытаетесь сделать, и что (и что не происходит) происходит с этим кодом.   -  person Etan Reisner    schedule 08.07.2015
comment
Какова цель этой команды find? Вы получаете количество каждого iso-файла из цикла, а затем используете поиск и ограничиваете его вывод точно таким же количеством?   -  person Etan Reisner    schedule 08.07.2015
comment
Ошибка здесь заключается в том, что переменная не разделена новой строкой, и меня спрашивает эхо, хочу ли я использовать file1.iso и file2.iso, поэтому обработка файла тоже не будет работать. Вывод Bash: Использовать RMCP01_copy.iso RMCP 01.iso? [Д/Н]? Последнее имя файла было для тестирования обходного пути пробела. Также я довольно новичок на этом сайте и его редактировании. Теперь вы можете снова прочитать пост ;).   -  person Max Hopfgartner    schedule 08.07.2015
comment
@EtanReisner Последние несколько строк поиска - это совпадения с файлами * .iso, поэтому вывод ограничен только этим.   -  person Max Hopfgartner    schedule 08.07.2015
comment
Тег processing следует использовать только для вопросов о языке обработки.   -  person Kevin Workman    schedule 08.07.2015
comment
Поиск выведет только .iso файлов из-за своих аргументов. Цикл также найдет только .iso файлов. find ищет только текущий каталог, поэтому они всегда должны находить одни и те же файлы. Я не понимаю, в чем здесь смысл? Если вам нужен список всех .iso файлов в одном каталоге, просто выполните isos=(*.iso) и покончите с этим. Затем зациклитесь на for iso in "${isos[@]}"; do, и не нужно возиться с IFS, не нужно использовать find, нет игр и все имена файлов безопасны.   -  person Etan Reisner    schedule 08.07.2015
comment
Проблема с вашим эхом заключается в том, что вы цитируете расширение $AX, поэтому оно не разделяется на слова для цикла. При этом весь этот подход, как я только что сказал, очень запутан.   -  person Etan Reisner    schedule 08.07.2015
comment
Это также решает проблему пробелов? Теперь я исправил команду find, чтобы она не отображала все, включая каталог, перед отображением совпадений, удалив файл . параметр, нет необходимости в трубе. Он должен разделять не слова, а строки.   -  person Max Hopfgartner    schedule 08.07.2015
comment
Какая проблема с пробелами? Использование цикла/массива напрямую не имеет проблем с пробелами в именах файлов. Использование find вводит проблемы с пробелами.   -  person Etan Reisner    schedule 08.07.2015


Ответы (3)


Переменная не работает с IFS \n в цикле for, я не понимаю, почему это происходит.

IFS='\n' не устанавливает IFS в новую строку, он устанавливает IFS в буквальную строку \n. Если вы хотите установить IFS на новую строку, используйте:

IFS=$'\n'
person Jahid    schedule 08.07.2015
comment
Спасибо, это была проблема помимо цитаты. - person Max Hopfgartner; 08.07.2015

Я вообще не вижу здесь необходимости в find или первом цикле.

Это делает то, что вы хотите?

for iso in *.iso
 do
  echo "Use $iso? [Y/N]?"
  read choiceoffile
  shopt -s nocasematch
  case $choiceoffile in
  y ) echo "Using selected file.";;
  * ) continue;;
  esac
  # some sort of processing
done

Я также удалил бесполезный случай n), поскольку случай по умолчанию прекрасно справляется с этим.

person Etan Reisner    schedule 08.07.2015

Я уже исправил это. Я выбросил кавычки переменной в цикле for, поправил объявление IFS в начале и убрал лишние конвейеры.
Это должно быть хорошим решением проблемы пробелов
Спасибо, теперь я могу вставить это в свой рабочий скрипт. Почему я сохранил кавычки?

#!/bin/bash

IFS=$'\n'   

AX=$(find *.wbfs -maxdepth 1 -type f )  

for wbfs in $AX  
 do  
  echo "Use "$wbfs"? [Y/N]?"  
  read choiceoffile  
  shopt -s nocasematch  
    case $choiceoffile in  
      y ) echo "Using selected file.";;  
      * ) continue;;  
    esac  
   # some sort of processing  
done  
person Max Hopfgartner    schedule 08.07.2015
comment
Это также может привести к сбою, если по ошибке у вас есть новая строка в каком-то имени файла. - person Marki555; 09.07.2015