Unix Calculator.bash 문제

Unix Calculator.bash 문제

이것은 Unix에서 숫자를 계산하기 위해 작성한 bash 스크립트입니다.

echo "Please enter the calculation(operation) type (+)(-)(*)(/)"
        read $opr
echo "Enter the first number"
        read $num1
echo "Enter the second number"
        read $num2
if [[ $opr = "+" ]]; then
        num=$(($num1 + $num2))
                echo "The sum is = $num"
elif [[ $opr = "-" ]]; then
        num=$(($num1 - $num2))
                echo "The sum is = $num"
elif [[ $opr = "*" ]]; then
        num=$(($num1 * $num2))
                echo "The sum is = $num"
elif [[ $opr = "/" ]]; then
        num=$(($num1 / $num2))
                echo "The sum is = $num"
fi

실행되지만 "합계는 ="이고 숫자를 제공하지 않습니다. 이 문제의 원인이 무엇인지 알 수 있나요?

답변1

현재 입력을 받는 방식이 잘못된 것 같아서 read수학이 전혀 이루어지지 않아 답이 없는 상태가 됩니다. 이 부분만 수정하면 나머지 코드가 작동할 것입니다.

읽는 방법

원래 게시된 코드에서 발췌한 내용은 다음과 같이 첫 번째 숫자를 저장하려고 시도하는 것을 보여줍니다.

echo "Enter the first number"
        read $num1

대신 -p프롬프트를 사용하여 달러 기호 없이 변수 이름을 지정해 보세요. 명령 프롬프트에서 다음을 테스트하여 num확인할 수도 있습니다.read -p ...

$ read -p "Enter the first number" num1
Enter the first number:

이제 1을 입력하세요.

$ read -p "Enter the first number" num1
Enter the first number: 1

이제 이렇게 하면 echo $num1값이 성공적으로 표시됩니다.

$ echo $num1
1
  • -p the_prompt_text힌트를 포함하는 메서드입니다.
  • 와 비교하여 끝에 반환 줄을 추가합니다 echo. echo하지만 -p그렇지 않기 때문에 저처럼 추가 공간을 두는 것이 더 낫습니다. 콜론 뒤에 :공백이 있다는 점에 유의하세요: "Enter the first number: ". 이는 사용자의 입력이 콜론 오른쪽에 표시되지 않도록 하기 위한 것입니다.
  • 응답을 담을 변수를 지정할 때 올바른 읽기 구문은 포함하지 않는 것 입니다 $.readnum1

read따라서 이를 통해 스크립트의 다양한 부분을 조정할 수 있으며 제대로 작동할 것입니다.

답변2

사용자 454038그리고남자 이름문제 해결 방법을 올바르게 설명하지만 잘못한 내용은 설명하지 않습니다. $ 인용하는 쉘에서 (또는 적어도 bash에서)의 가치변수이지만 변수 자체를 참조할 때(예:환경값). 이것은 혼란스럽습니다. 대부분의 (모두?) 일반 프로그래밍 언어에서는 어느 쪽이든 동일한 구문이 사용됩니다. 당신은 당신이 말하는 개념을 부분적으로 이해하는 것 같습니다.

num=$(($num1 + $num2))

흔한 실수를 저지르는 대신

$num=$(($num1 + $num2))                                                (이러지 마세요!)

이는 read이 진술에도 적용됩니다. 확장될 예정입니다(예: read $opr다음으로 대체됨 ).$opr현재의변수 값 opr) - 변수의 현재 값은 opr빈 문자열입니다. 그래서 명령은 다음과 같이 보입니다.

read

이것이 버그라고 생각할 수도 있습니다. 실제로는 read REPLY. 그래서,

$ $num1 읽기
번호 17
$에코 $num1
                                                                    (빈 라인 출력)
$echo$REPLY
번호 17

이 예에서는 메커니즘을 더 잘 설명합니다.

$ superman=clark_kent
$ read $superman
man of steel
$ echo $superman
clark_kent
$ echo $clark_kent
man of steel

그러나 이와 같은 작업(특히 위의 예)은 너무 복잡하기 때문에 수행해서는 안 됩니다. 독자/유지관리자는 코드가 수행하는 작업을 이해하는 데 어려움을 겪을 것입니다.

긴 이야기 짧게

귀하의 진술은 , 및 ( s 없이 ) read이어야 합니다 .read oprread num1read num2$

관련 정보