bash로 두 개의 숫자를 더하거나 빼는 방법은 무엇입니까?


90

나는 숫자와 작업을 읽을 수 있습니다 :

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

그러나 숫자를 추가하려는 모든 시도는 실패합니다.

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac

운영:

First number please
1
Second mumber please
2
Operation?
+

산출:

num1+num2

...또는...

echo $num1+$num2;;

# results in: 1+2    

...또는...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found

add를 추가하려고 할 때 여전히 문자열을 얻는 것처럼 보입니다 ( "4"대신 "2 + 2").


5
나는 이것이 일반적인 질문이기 때문에 제목을 편집했으며 컨텍스트를 좁 히면 이것이 case한 줄을 제외하고 는 아무런 관련이 없다는 것을 깨달았 echo $num+$num 입니다. : 프로그래밍 질문에 컨텍스트를 최소화과 아이디어는 여기에 설명 sscce.org
금발 미녀

2
+1 안녕하세요 goldilocks, 그렇습니다. 나중에 나에게 분명해졌습니다. 그러나 그렇습니다. 나는 당신의 추론에 완전히 동의합니다. 난 당신의 편집을 환영합니다 :) 감사합니다 :)
Michael Durrant

답변:


116

POSIX 쉘에서 산술이 이루어집니다 $두 번 괄호 (( )):

echo "$(($num1+$num2))"

그 (sans echo) 에서 할당 할 수 있습니다 :

num1="$(($num1+$num2))"

또한있다 expr:

expr $num1 + $num2

스크립팅에서는 명령 $(())의 포크 / 실행을 피하기 때문에 바람직합니다 expr.


또는 echo $(($num1$op$num2))관여하지 않고 직접 case.
manatwork

여기에는 case관여 하지 않습니다 .
goldilocks

1
아니요, 그러나 literal을 사용 +했으므로 case빼기를 개별적으로 처리하려면 외부 가 필요합니다 .
manatwork

1
@manatwork : caseOP 코드에서 코드를 제거 echo $(($num1$op$num2))하면 작동하지만 case기본값을 사용하여 오류를 처리 할 수 ​​있으므로 더 강력합니다 *.
goldilocks

둘 다 +1 나는 사건을 사용하고 있었지만 (처음에는 그것을 보여주지 않았을 수도 있지만) 두 사람 모두 문제가 사건에 관한 것이 아님을 깨달았습니다.
Michael Durrant

13

기존 답변은 순수한 bash 이므로이 것보다 빠르지 만 정수 만 처리 할 수 ​​있습니다. 수레를 처리해야하는 경우 외부 프로그램을 사용해야합니다 bc.

$ echo 'scale=4;3.1415+9.99' | bc
13.1315

scale=4말한다 bc네 개의 소수 자릿수를 사용 할 수 있습니다. 자세한 내용 man bc은 참조하십시오.


그 동안 참고 bash로 포인트를 arithmetics 부동 지원하지 않습니다 $((...)), 많은 쉘 ( ksh93, zsh, yash적어도) 않습니다. bc쉘 산술은 프로세서 double유형으로 제한되는 반면 임의의 정밀도를 지원한다는 장점이 있습니다. scale여기 에서 설정할 필요는 없습니다 . 또한 scale매개 변수는 사용되지 않습니다. 척도는 3.1415+9.99피연산자 (여기서는 4) 의 척도에서 파생됩니다.
Stéphane Chazelas

한 값이 450있고 다른 값 이 10 진수로 변수에 저장된 경우 수학을 수행하는 방법 은 $mynumber무엇입니까? 예를 들면 다음과 같습니다 450-$mynumber.
Sigur

@sigur 가해 echo "450-$mynumber" | bc야합니다. 변수를 확장하려면 작은 따옴표 대신 큰 따옴표를 사용해야합니다.
evilsoup

@evilsoup, 이제 매력처럼 작동합니다. 감사.
Sigur

computedval=$(echo 'scale=10;var1-var2' | bc)작동하지 않거나 작동하지 않음computedval=$(echo 'scale=10;$var1-$var2' | bc)
StatsSorceress

5
echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   

참고 \(가) 전 *(곱셈), 전체 표현식이 역 인용 부호`내이어야한다.


1
expr필요하지 않으며 표준 출력에 다시 기록하기 위해 명령의 표준 출력을 캡처 할 필요가 없습니다.
chepner


1

$[ ... ]구조를 사용할 수도 있습니다 . 이 경우 우리는 Bash에 내장 된 메커니즘을 사용하는데, 이는보다 빠르고 사용하기 편리합니다. 우리는 $ [와] 사이의 모든 것이 표현식으로 취급된다는 것을 알고 있으므로 변수 앞에을 추가 할 필요는 없습니다 $. *마찬가지로 패턴처럼 취급 하지 않아도됩니다 .

num1=2
num2=3
echo $[num1 + num2]
5

0

사용자가 요청한 입력 순서에 따라 리버스 폴리쉬 표기법을 사용하고있는 것 같습니다 .

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

dc(데스크 계산기) 직접 사용하는 것이 더 좋을 수도 있습니다 .

DESCRIPTION
       Dc is a reverse-polish desk calculator which supports unlimited pre-
       cision arithmetic.

다음을 사용하는 세션 예 dc:

$ dc
1 2 + p    # This part is typed; the result comes next.
3
q  # This is also typed.
$

또는 비 대화식으로 :

$ dc -e '1 2 + p'
3
$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.