我首先使用curl获取文件大小信息
fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length | awk '{print $2}')
echo $fileSize
1825 年
然后我下载文件并检查大小
downloadedSize=$(wc -c ioctl.h | awk '{print $1}')
echo $downloadedSize
1825 年
然后我想比较这些变量。但条件总是假的
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"