expr 산술 괄호: 3 * (2 + 1)

expr 산술 괄호: 3 * (2 + 1)

expr괄호를 싫어하는 것 같습니다(수학에서 명시적인 연산자 우선 순위를 위해 사용됨).

expr 3 * (2 + 1)
bash: syntax error near unexpected token `('

Bash에서 연산자 우선 순위를 표현하는 방법은 무엇입니까?

답변1

대신 산술 확장을 사용할 수 있습니다.

echo "$(( 3 * ( 2 + 1 ) ))"
9

제 개인적인 의견으로는 를 사용하는 것보다 이것이 더 좋아 보입니다 expr.

~에서man bash

산술 확장 산술 확장을 사용하면 산술 표현식을 평가하고 결과를 바꿀 수 있습니다. 산술 확장의 형식은 다음과 같습니다.

         $((expression))

표현식은 큰따옴표로 묶인 것처럼 처리되지만, 괄호 안의 큰따옴표는 특별히 처리되지 않습니다. 표현식의 모든 토큰은 매개변수 확장, 문자열 확장, 명령 대체 및 따옴표 제거를 거칩니다. 산술 확장은 중첩될 수 있습니다.

평가는 아래의 산술 평가 항목에 나열된 규칙에 따라 수행됩니다. 표현식이 유효하지 않으면 bash는 실패를 나타내는 메시지를 인쇄하고 대체가 발생하지 않습니다.

답변2

Bash 내장 명령을 사용하는 let또 다른 방법 :

$ let a="3 * (2 + 1)"
$ printf '%s\n' "$a"
9

노트

~처럼@Stéphane Chazelas가 지적했습니다., 가독성을 위해 또는 산술 연산을 위해 bash사용해야 합니다 .((...))exprlet

쉽게 이식하려면 $((...))다음과 같은 것을 사용하세요.@Bernhard가 답변했습니다..

답변3

expr현대 쉘에서는 산술을 사용할 이유가 없습니다 .

POSIX는 $((...))스프레드 연산자를 정의합니다. 따라서 모든 POSIX 호환 셸( sh모든 최신 Unix 계열 셸, dash, bash, yash, mksh, zsh, posh, ksh...) 에서 사용할 수 있습니다 .

a=$(( 3 * (2 + 1) ))
a=$((3*(2+1)))

kshlet동일한 유형의 산술 표현식을 전달하고 다른 것으로 확장하지 않지만 다음과 같이 표현식이 0으로 확인되는지 여부에 따라 종료 상태를 반환하는 내장 함수도 도입되었습니다 expr.

if let 'a = 3 * (2 + 1)'; then
  echo "$a is non-zero"
fi

expr그러나 인용하면 어색하고 읽기가 어려워지므로(물론만큼은 아니지만) 다른 형식 ksh도 도입됩니다 .((...))

if (( a = 3 * (2 + 1) )) && (( 3 > 1 )); then
  echo "$a is non-zero and 3 > 1"
fi
((a+=2))

더 명확하고 사용해야합니다.

let및 , 및 ((...))에만 적용 됩니다 . 다른 셸로의 이식성이 필요한 경우 이 구문을 선호해야 합니다. POSIX 이전 Bourne 유사 셸(일반적으로 Bourne 셸 또는 Almquist 셸의 이전 버전)에서만 필요합니다.kshzshbash$((...))expr

Bourne 이외의 측면에는 산술 연산자가 내장된 쉘이 있습니다.

  • csh/ tcsh(실제로 산술 평가 기능이 내장된 최초의 Unix 셸):

    @ a = 3 * (2 + 1)
    
  • akanga(기준 rc)

    a = $:'3 * (2 + 1)'
    
  • 역사적인 기록을 위해 1989년 유즈넷에 출시된 Almquist 셸의 원본 버전에는 expr내장 기능이 있었지만(실제로는 이 기능과 병합됨 test) 나중에 제거되었습니다.

답변4

괄호와 따옴표를 사용하세요.

expr 3 '*' '(' 2 '+' 1 ')'
9

따옴표는 bash가 괄호를 bash 구문으로 해석하는 것을 방지합니다.

관련 정보