먼저 파일 크기 정보를 얻기 위해 컬을 사용합니다.
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 헤더에는 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"