스크립트에서 +, -, x, / 문자를 매개변수로 사용하는 방법

스크립트에서 +, -, x, / 문자를 매개변수로 사용하는 방법

저는 스크립트의 인수($1, $2, $3)를 사용하여 기본 계산을 수행하는 calc.sh라는 스크립트를 작성하려고 합니다. 예를 들어, ./calc.sh 10 / 5의 결과로 2를 얻고 싶습니다.

내가 시작한 방법은 다음과 같습니다.

if [ $2 -eq "+" ] ; then res=`expr $1 + $3` ; echo "$res" ; fi

하지만 작동하지 않습니다. 다음과 같은 결과가 나타납니다. Line 2: [+: 정수 표현식이 필요합니다.

이제 비교를 위해 ==를 사용하고 /를 제외한 모든 항목에서 잘 작동합니다. 이제 코드는 다음과 같습니다:

if [ $2 == "+" ] ; then res=`expr $1 + $3` ;
elif [ $2 == "-" ] ; then res=`expr $1 - $3` ;
elif [ $2 == "x" ] ; then res=`expr $1 \* $3` ;
elif [ $2 == "/" ] ; then res=`expr $1 \/ $3` ;
else res=`Operación no válida` ;
fi ; echo "$res"

하지만 을 시도하면 다음과 같은 메시지 ./calc.sh 10 / 5 가 표시됩니다. "라인 4: 10/5: 구문 오류: 잘못된 산술 연산자(오류 요소는 "\5")... 아아, 이것을 입력하면서 $1/$3이어야 한다는 것을 깨달았습니다.. .
:)

답변1

bash쉘을 사용하는 경우 다음 을 시도해 볼 수 있습니다.

if [ $2 == "+" ] ;then
 res=$(($1 + $3))
 echo $res 
fi

편집하다

'다음 줄을 변경합니다( by 로 대체됨 ").

else res=`Operación no válida` ;

도착하다:

else res="Operación no válida" ;

편집 2

if else너무 많은 문을 사용하는 대신 Case 문을 사용할 수 있습니다.

case $2 in
+)
  res=`expr $1 + $3`
  ;;
-)
  res=`expr $1 - $3`
  ;;
/)
  res=`expr $1 \/ $3`
  ;;
x)
  res=`expr $1 \* $3`
  ;;
*)
  res="Operación inválida"
  ;;
esac

echo "$res"

답변2

스크립트:

#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"

그것으로 +쉽습니다:

./calc.sh 10 + 2
10 + 2 = 12

하지만 별표는 이스케이프 처리해야 합니다.

./calc.sh 10 \* 2
10 * 2 = 20

또는

./calc.sh 10 "*" 2
10 * 2 = 20

답변3

@AlexP가 이미 지적했듯이 문자열 비교가 아닌 산술을 수행합니다.

나는 또한 사용을 강력히 권장합니다이중 괄호 [[]]개별적으로보다는.

그러면 코드는 다음과 같이 작성할 수 있습니다.

#!/bin/bash

if [[ $2 == "+" ]]; then
    echo $(($1+$3))
elif [[ $2 == "/" ]]; then
    echo $(($1/$3))
fi

실행 예:

./math.sh 2 + 7
9
./math.sh 7 / 2
3

답변4

+, -또는 은 셸이나 명령 에만 해당 x되지 않습니다 . 귀하의 질문은 다음과 같습니다/[

  • -eq수치 비교를 위해. =문자열 비교 대신 사용
  • 변수를 인용하는 것을 잊었습니다.
  • ==표준 sh [연산자 가 아님

그래서:

if [ "$2" = + ]; then
  res=`expr "$1" + "$2"`
fi

또는 case생성자를 사용하십시오.

case $2 in
  + | - | /) res=`expr "$1" "$2" "$3"`;;
          x) res=`expr "$1" "*" "$3"`;;
          *) echo >&2 invalid; exit 1;;
esac

expr이는 고대 시스템을 처리해야 하는 경우에만 사용된다는 점에 유의하세요. 최신 표준 sh구현에는 연산자를 통한 산술 확장이 내장되어 있으며 대신 $((...))더 나은 형태의 명령 대체를 사용합니다 .$(...)`...`

관련 정보