초보자 스크립팅 도움말

초보자 스크립팅 도움말

저는 두 개의 정수를 요청한 다음 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

  1. =정수 비교( ) 대신 문자열 비교( )를 사용해야 합니다 eq.

  2. 스크립트에 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로 평가되는 각 명령문은 다른 모든 테스트와 독립적으로 실행됩니다.

관련 정보