POSIX는 쉘이 이항 연산자 +, - 또는 *가 있는 $(( a * b))
계산기 와 같은 표현식을 평가할 수 있어야 한다고 정의하는 것 같습니다 . *
나는 내 자신의 쉘을 위한 계산기를 작성하고 이에 대한 테스트 스크립트를 작성했습니다.
$ $((32 * 32))
$((32 * 32))
Result = 1024
하지만 테스트를 실행하면 셸에서 출력(1024)을 얻을 수 없습니다. 수동으로 확인하는 대신 쉘이 실제로 올바른 결과를 계산하는지 여부를 스크립트에서 테스트하고 싶습니다. 현재 내 테스트는 수동 검사로 작동하지만 결과가 올바른지 프로그래밍 방식으로 확인하고 싶습니다.
printf "********************* TEST Arithmetics ... .\nYou should see the number 4096 below "
#read _
valgrind --leak-check=yes ./shell .<< EOF
echo $((64 * 64))
EOF
테스트 결과는 다음과 같습니다.
********************* TEST Arithmetics ... .
You should see the number 4096 below 'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin.
stdin is a file or a pipe
4096
==31803==
==31803== HEAP SUMMARY:
==31803== in use at exit: 79,725 bytes in 167 blocks
==31803== total heap usage: 502 allocs, 335 frees, 228,175 bytes allocated
==31803==
==31803== LEAK SUMMARY:
==31803== definitely lost: 0 bytes in 0 blocks
==31803== indirectly lost: 0 bytes in 0 blocks
==31803== possibly lost: 0 bytes in 0 blocks
==31803== still reachable: 79,725 bytes in 167 blocks
==31803== suppressed: 0 bytes in 0 blocks
==31803== Reachable blocks (those to which a pointer was found) are not shown.
==31803== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==31803==
==31803== For counts of detected and suppressed errors, rerun with: -v
==31803== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)
==31805== Memcheck, a memory error detector
==31805== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==31805== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==31805== Command: ./shell .
==31805==
고쳐 쓰다
이것은 작동하고 파일에 쓰고 파일에서 숫자 1024를 찾습니다.
#!/bin/ksh
#read _
./shell .<< EOF > tmp.txt
echo $((32*32))
EOF
답변1
if [ "1024" == "$((32*32))" ]; then
echo "The test worked"
else
echo "The test failed"
fi
이것은 작동합니다. 쉘이 산술을 사용하지 않으면 $(( ))
문자열이 일치하지 않습니다. 다음과 같이 단축할 수도 있습니다.
[ "1024" == "$((32*32))" ] || echo "I can't math!"