이것은 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: "
. 이는 사용자의 입력이 콜론 오른쪽에 표시되지 않도록 하기 위한 것입니다. - 응답을 담을 변수를 지정할 때 올바른 읽기 구문은 포함하지 않는 것 입니다
$
.read
num1
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 opr
read num1
read num2
$