如果变量相同则始终为 false

如果变量相同则始终为 false

我首先使用curl获取文件大小信息

fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length | awk '{print $2}')

echo $fileSize1825 年

然后我下载文件并检查大小

downloadedSize=$(wc -c ioctl.h | awk '{print $1}')

echo $downloadedSize1825 年

然后我想比较这些变量。但条件总是假的

if [[ "$fileSize" == "$downloadedSize" ]]; then
    echo "success"
  else
    echo "fail"
  fi

我尝试过这些

if [ "$fileSize" == "$downloadedSize" ]; then
if [ $fileSize == $downloadedSize ]; then
if [[ $fileSize == $downloadedSize ]]; then

-eq不是==

怎么了 ?

答案1

跑步 :

$ echo "$fileSize" | od -c
0000000   1   8   2   5  \r  \n
0000006
$ echo "$downloadedSize" | od -c
0000000   1   8   2   5  \n
0000005

显示在第一种情况下,值后面附加了一个回车符(http-headers 有 dos 行终止符:CRLF),而第二个变量是正确的。去掉 CR ( \r),您的测试就会起作用。例如:

fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head |
   awk '/Content-Length/ {gsub("\r",""); print $2; exit}')

答案2

由于条件中的两个操作数都是数字,因此您应该使用

if [[ $fileSize -eq $downloadedSize ]]; then

如果变量值中有空格,大小写会处理这个问题。

答案3

使用[or [[,语法不一样。这些不是同一个命令。可以使用内置命令而不是巨大的外部 awk 来制定解决方案。我使用 grep,使用内置命令也可以执行相同的操作case


filesize=$(curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length)
downloadedSize=$(wc -c < ioctl.h )
filesize=${filesize//[^0-9]/}              # rm not numbers 

downloadedSize=${downloadedSize//[^0-9]/} 

answer="not same"
# compare strings
[ "$filesize" = "$downloadedSize" ] && answer="same"
echo "$answer"

相关内容