Расширение переменной 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[@]}" \)