代码之家  ›  专栏  ›  技术社区  ›  Tom

Bash比较值

  •  1
  • Tom  · 技术社区  · 7 年前

    remote

    remote=`curl -sI $FILE | grep -i Length | awk '/Content/{print $(NF-0)}'`
    

    一旦我下载了文件,我就可以得到本地文件的大小:

    local=`stat --print="%s" $file`
    

    如果我回显远程和本地,它们包含相同的值。

    我正试着用if语句

    if [ "$local" -ne "$remote" ]; then
    

    谢谢

    1 回复  |  直到 7 年前
        1
  •  4
  •   Gordon Davisson    7 年前

    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:/ 进一步简化。

    推荐文章