curl
вывод использует сетевой формат для текста, означающий, что строки заканчиваются переводом каретки с последующим переводом строки;Инструменты Unix (например, оболочка) ожидают, что строки заканчиваются простым переводом строки, поэтому они рассматривают CR как часть содержимого строки и часто путаются.В этом случае происходит то, что переменная remote
получает длину содержимого и CR, что недопустимо в числовом выражении, следовательно, ошибки.Есть много способов обрезать CR, но в этом случае, вероятно, проще всего сделать awk
вместе с извлечением поля:
remote=$(curl -sI "$remotefile" | grep -i Length | awk '/Content/{sub("\r","",$NF); print $NF}')
Кстати, я также взял на себя смелость пометить галочки на $( )
- это легче читать, и у него нет некоторых странностей с побегами, которые есть у обратных кавычек, поэтому это предпочтительный синтаксис для захвата вывода команды.Да, и (NF-0)
эквивалентно просто NF
, поэтому я упростил это.Как отметил в комментарии @Jason, безопаснее использовать строчные или смешанные регистры для имен переменных и ставить двойные кавычки вокруг ссылок на них, поэтому я сделал это, изменив $FILE
на "$remotefile"
.Вы должны сделать то же самое с локальной переменной имени файла.
Вы также можете удалить команду grep
и выполнить поиск /^Content-Length:/
awk
, чтобы еще больше упростить ее.