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
사용해야 합니다 .((...))
expr
let
쉽게 이식하려면 $((...))
다음과 같은 것을 사용하세요.@Bernhard가 답변했습니다..
답변3
expr
현대 쉘에서는 산술을 사용할 이유가 없습니다 .
POSIX는 $((...))
스프레드 연산자를 정의합니다. 따라서 모든 POSIX 호환 셸( sh
모든 최신 Unix 계열 셸, dash, bash, yash, mksh, zsh, posh, ksh...) 에서 사용할 수 있습니다 .
a=$(( 3 * (2 + 1) ))
a=$((3*(2+1)))
ksh
let
동일한 유형의 산술 표현식을 전달하고 다른 것으로 확장하지 않지만 다음과 같이 표현식이 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 셸의 이전 버전)에서만 필요합니다.ksh
zsh
bash
$((...))
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 구문으로 해석하는 것을 방지합니다.