내 쉘에서 $((a * b)) 평가 확인 [닫기]

내 쉘에서 $((a * b)) 평가 확인 [닫기]

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!"

관련 정보