저는 두 개의 정수를 요청한 다음 a/s/m/d를 선택하여 더하기, 빼기, 곱하기 또는 나누기를 요청하는 클래스용 스크립트를 만들고 있습니다. 또한 정수와 유효한 옵션을 입력했는지 확인하지만 이에 대해서는 나중에 다루겠습니다. 이제 이것이 내가 가진 것입니다:
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
if [ "$func" -eq "a" ]; then
echo $((num1 + num2))
fi
if [ "$func" -eq "s" ]; then
echo $((num1 - num2))
fi
if [ "$func" -eq "m" ]; then
echo $((num1 * num2))
fi
if [ "$func" -eq "d" ]; then
echo $((num1 / num2))
fi
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
실행하면 콘텐츠를 올바르게 요청하지만 이해할 수 없는 오류가 발생합니다.
./MathTest.sh: line 9: [: a: integer expression expected
./MathTest.sh: line 13: [: a: integer expression expected
./MathTest.sh: line 17: [: a: integer expression expected
./MathTest.sh: line 21: [: a: integer expression expected
./MathTest.sh: line 25: syntax error near unexpected token `else'
./MathTest.sh: line 25: `else'
누구든지 이 문제를 해결하도록 도와주실 수 있나요?
답변1
=
정수 비교( ) 대신 문자열 비교( )를 사용해야 합니다eq
.스크립트에
else
해당 문이 없습니다if
. 일련의 if/then/else if/then/.../else 문을 수행하려면if ... elif ... elif .... else ... fi
대신 ...을 사용해야 합니다.if ... fi; if ... fi; if ... fi; else
또는성명 을 사용하십시오case
.명확하지 않다면
elif
이라는 뜻입니다else if
.예를 들어:
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
case "$func" in
a) echo $((num1 + num2)) ;;
s) echo $((num1 - num2)) ;;
m) echo $((num1 * num2)) ;;
d) echo $((num1 / num2)) ;;
*) echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide" ;;
esac
각 사례에 대한 코드는 두 개의 세미콜론으로 끝나야 한다는 점에 유의하세요 ;;
. 이는 각 사례에 여러 코드 문이 있을 수 있기 때문입니다(개행 또는 단일 세미콜론으로 구분). 따라서 쉘 인터프리터는 다른 상황을 구별할 수 있는 방법이 필요합니다. 사건과 사건의 끝, 그리고 ;;
그것이 무엇을 하는 데 사용되는지.
사례당 두 개의 문을 보여주는 간단한 예:
case "$func" in
a) echo "addition:" ; echo $((num1 + num2)) ;;
s) echo "subtraction:" ; echo $((num1 - num2)) ;;
...
esac
case
명령문(제 생각에는 코드를 더 읽기 쉽게 만들고 확실히 더 짧고 덜 반복적으로 만듭니다) 대신 다음과 같이 if/elif/else/fi를 사용할 수 있습니다.
if [ "$func" = "a" ]; then
echo $((num1 + num2))
elif [ "$func" = "s" ]; then
echo $((num1 - num2))
elif [ "$func" = "m" ]; then
echo $((num1 * num2))
elif [ "$func" = "d" ]; then
echo $((num1 / num2))
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi
이는 비교 =
보다는 사용 -eq
을 의미하며(숫자가 아닌 문자열을 비교하기 때문입니다) 단일 if ... fi 문이 아닌 if, elif, elif, elif, else, fi 문의 긴 목록입니다.
그건 그렇고, if/elif/fi 체인과 여러 if ... fi 문 사이에는 매우 중요한 차이가 있습니다. if/elif/elif/elif/.../else/fi의 경우에만첫 번째참 결과는 영원히 실행되며(그 중 어느 것도 참이 아니면 else 코드가 실행됩니다) 명령문이 작동하는 case ... esac
방식 과 비슷하게 쉘은 전체 체인의 끝으로 점프합니다.
여러 if ... fi
명령문의 경우 각 명령문은 차례로 평가되고 true로 평가되는 각 명령문은 다른 모든 테스트와 독립적으로 실행됩니다.