Bash比较值

Bash比较值,bash,file,comparison,Bash,File,Comparison,我从远程Web服务器获取一个文件的大小,并将结果保存到名为remote的变量中,我使用以下方法获取: remote=`curl -sI $FILE | grep -i Length | awk '/Content/{print $(NF-0)}'` 下载文件后,我将使用以下工具获取本地文件大小: local=`stat --print="%s" $file` 如果回显远程和本地,则它们包含相同的值 我正在尝试对此运行if语句 if [ "$local" -ne "$remote" ]; th

我从远程Web服务器获取一个文件的大小,并将结果保存到名为
remote
的变量中,我使用以下方法获取:

remote=`curl -sI $FILE | grep -i Length | awk '/Content/{print $(NF-0)}'`
下载文件后,我将使用以下工具获取本地文件大小:

local=`stat --print="%s" $file`
如果回显远程和本地,则它们包含相同的值

我正在尝试对此运行if语句

if [ "$local" -ne "$remote" ]; then
但它总是显示错误消息,从不建议它们匹配

有人能告诉我我做错了什么吗


感谢

curl
的输出使用文本的网络格式,这意味着行由回车符和换行符终止;unix工具(如shell)希望行仅以换行结束,因此它们将CR视为行内容的一部分,并且经常会感到困惑。在本例中,发生的情况是
remote
变量正在获取内容长度和CR,这在数值表达式中无效,因此会出现错误。有许多方法可以去除CR,但在这种情况下,让
awk
与字段提取一起进行可能是最简单的方法:

remote=$(curl -sI "$remotefile" | grep -i Length | awk '/Content/{sub("\r","",$NF); print $NF}')
顺便说一句,我还冒昧地用
$()
替换了backticks——这更易于阅读,而且没有backticks所具有的转义的一些奇怪之处,因此它是捕获命令输出的首选语法。哦,
(NF-0)
相当于
NF
,所以我简化了它。正如@Jason在一篇评论中指出的,最安全的做法是对变量名使用小写或混合大小写,并在引用周围加上双引号,因此我将
$FILE
改为
“$remotefile”
。您应该对本地filename变量执行相同的操作


您还可以删除
grep
命令,让
awk
搜索
/^Content Length://
,以进一步简化它。

curl
的输出使用文本的网络格式,这意味着行由回车符和换行符终止;unix工具(如shell)希望行仅以换行结束,因此它们将CR视为行内容的一部分,并且经常会感到困惑。在本例中,发生的情况是
remote
变量正在获取内容长度和CR,这在数值表达式中无效,因此会出现错误。有许多方法可以去除CR,但在这种情况下,让
awk
与字段提取一起进行可能是最简单的方法:

remote=$(curl -sI "$remotefile" | grep -i Length | awk '/Content/{sub("\r","",$NF); print $NF}')
顺便说一句,我还冒昧地用
$()
替换了backticks——这更易于阅读,而且没有backticks所具有的转义的一些奇怪之处,因此它是捕获命令输出的首选语法。哦,
(NF-0)
相当于
NF
,所以我简化了它。正如@Jason在一篇评论中指出的,最安全的做法是对变量名使用小写或混合大小写,并在引用周围加上双引号,因此我将
$FILE
改为
“$remotefile”
。您应该对本地filename变量执行相同的操作


您也可以删除
grep
命令,让
awk
搜索
/^Content Length://
以进一步简化它。

声明-p本地远程的输出是什么
,但是
local
是一个保留字,用于定义函数中的局部变量。在
curl
输出的末尾可能有一个回车符。使用
printf“%q\n'$remote”
检查是否存在
\r
declare-p local remote
的输出可能不是问题的根源,但
local
是一个保留字,用于在函数中定义局部变量。在
curl
输出的末尾可能有一个回车符。如果有
\r
,请使用
printf“%q\n'$remote”
检查。非常感谢这对我帮助很大,解决了我的问题。非常感谢这对我帮助很大,解决了我的问题。