curl
的输出使用文本的网络格式,这意味着行由回车符和换行符终止;unix工具(如shell)希望行以linefeed结束,因此它们将CR作为行内容的一部分,并且经常会混淆。在这种情况下,发生的是
remote
变量正在获取内容长度
和
CR在数值表达式中无效,因此会出错。有很多方法可以去除CR,但在这种情况下,它可能是最容易的
awk
在现场提取的同时进行:
remote=$(curl -sI "$remotefile" | grep -i Length | awk '/Content/{sub("\r","",$NF); print $NF}')
$( )
--这更易于阅读,并且没有backticks所具有的转义的一些奇怪之处,因此它是捕获命令输出的首选语法。哦,还有
(NF-0)
NF
,所以我简化了。正如@Jason在一篇评论中指出的,最安全的方法是对变量名使用小写或混合大小写,并在引用前后加上双引号,所以我通过更改
$FILE
"$remotefile"
. 您应该对本地filename变量执行相同的操作。
你也可以放下枪
grep
命令和拥有
啊
/^Content-Length:/
进一步简化。