변수가 동일하면 항상 false

변수가 동일하면 항상 false

먼저 파일 크기 정보를 얻기 위해 컬을 사용합니다.

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 헤더에는 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

[또는 를 사용하면 [[구문이 다릅니다. 이는 동일한 명령이 아닙니다. 대규모 외부 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"

관련 정보