Расширение переменной bash и цитирование для части команды find

У меня есть некоторый код, подобный следующему внутри скрипта Bash:

FileNames=""
while read -r FileName; do
    ...
    FileNames+=" -o -iname \"$FileName\""
    ...
done <"$ListOfFileNames"
FileNames="${FileNames# -o }"
find foo -type f \( $FileNames \)

Обычно это работало на меня, пока я не обнаружил, что некоторые имена файлов содержат пробелы (и, возможно, другие специальные символы). Когда я добавил дополнительные цитаты вокруг использования $FileName чтобы покрыть эти случаи, расширение $FileNames в пределах find команда начинает плохо себя вести. Я пробовал различные другие способы цитирования и спасения и вышел пустым. Я успешно использовал переменные во многих других написанных мной сценариях, но этот сбил меня с толку. Я запускаю сценарий под Cygwin. Есть ли хороший способ справиться с этим?

1 ответ

Используйте массив. Массивы могут лучше обрабатывать пробелы. Для большей безопасности используйте также IFS= сохранить ведущие пробелы с read,

FileNames=(-false)
while IFS= read -r FileName; do
    ...
    FileNames+=(-o -iname "$FileName")
    ...
done < "$ListOfFileNames"
find foo -type f \( "${FileNames[@]}" \)
Другие вопросы по тегам