2016-04-01 1 views
0

У меня есть некоторый код, как следующий внутри 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. Есть ли хороший способ справиться с этим?

+0

Я просто искал ответ на это сам. [Здесь ya go.] (Http://stackoverflow.com/a/143172/6142694) –

+0

Barmar, ссылка, которую вы предоставляете, не отображалась так, как я искал, но я вижу, что это в основном та же проблема. Тем не менее, я бы сказал, что это не «точный дубликат», поскольку ему не приходилось иметь дело с цитированием вложенного расширения, а затем с удалением части переменной (с которой я ошибся в первый раз, когда я попробовал метод массива). – knokej

+0

Даниэль, я на самом деле не видел, что место, куда ваша ссылка отправила меня, объясняла мою проблему с переменным расширением внутри команды, но теперь это вода под мостом. – knokej

ответ

0

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

FileNames=(-false) 
while IFS= read -r FileName; do 
    ... 
    FileNames+=(-o -iname "$FileName") 
    ... 
done < "$ListOfFileNames" 
find foo -type f \("${FileNames[@]}" \) 
+0

Спасибо, Джон, это сработало, за исключением того, что мне нужно было выяснить, как правильно получить функциональность 'FileNames = '$ {FileNames # -o}". Сначала я просто установил первый элемент массива в "", но это не сработало. 'unset' сделал работа. – knokej

Смежные вопросы