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).

3 ответа

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

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

IFS=$'\n'

Я не вижу необходимости в 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) случай как случай по умолчанию обрабатывает это просто отлично.

Я исправил это сейчас. Я отбросил кавычки переменной в цикле 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  
Другие вопросы по тегам