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