Linux 쉘 스크립트의 if...elif 문에 오류가 있습니다.

Linux 쉘 스크립트의 if...elif 문에 오류가 있습니다.
#!/bin/bash
echo "enter your choice :"
echo "1 Addition"
echo "2 subtract"
echo "3 Multiplication"
read er
echo "enter the first number : "
read a
echo "enter the second number : "
read b
if [ $er="1" ]
then
sum=`expr $a + $b`
echo "sum of two numbers is $sum"
elif [ $er="2" ]
then
sub=`expr $a - $b`
echo "the diff of two numbers is $sub"
exit 0
elif [ $er="3" ]
then
mult=`expr $a * $b`
echo "the div of two numbers is $mult"
exit 0
else
echo "invalid choice"
fi

이것은 간단한 계산기 스크립트입니다. 하지만 첫 번째 덧셈 if 문까지만 실행되고, 그 이후에는 곱셈, 뺄셈 조건이 참이더라도 elif 문은 실행되지 않습니다.

답변1

=테스트에서는 주위에 공백이 필요합니다. $er=1그렇지 않으면 (예를 들어) 비교로 올바르게 해석되지 않습니다.

if [ "$er" = "1" ]           # or:  if [ "$er" -eq 1 ]
then
sum=`expr "$a" + "$b"`       # or:  sum=$( expr "$a" + "$b" )  or: sum=$(( a + b ))
echo "sum of two numbers is $sum"
elif [ etc...

또한 변수 확장에 대한 참조를 참고하세요. 코드 뒷부분에서는 파일 이름 글로빙 패턴으로 해석되지 않도록 *인용 부호를 넣어야 합니다.mult=`expr $a * $b`

expr각각을 동등한 것으로 바꿀 수 있습니다 $(( ... ))(산술 확장). 지난 수십 년 동안 그것은 expr사용되지 않게 되었습니다.

명령을 대체하기 위해 백틱을 사용하는 것도 권장되지 않습니다. 구문은 $( ... )여러 면에서 더 좋습니다. 예를 들어, 중첩이 더 좋습니다.

result=$( echo $( echo a ) $( echo b ) )  # pretty much impossible with backticks

...그리고 인용문도 더 잘 작동합니다. 내부 인용문과 외부 인용문이 $( ... )서로 간섭하지 않기 때문입니다.

또한보십시오:


case ... esac이 코드를 사용 하면 이점을 얻을 수 있습니다 .

case "$er" in
    1) result=$(( a + b )); op='sum'        ;;
    2) result=$(( a - b )); op='difference' ;;
    3) result=$(( a * b )); op='product'    ;;
    *) printf 'Invalid choice: "%s"?\n' "$er" >&2
       exit 1
esac

printf 'The %s of %s and %s is %s\n' "$op" "$a" "$b" "$result"

관련 정보