Bash 산술은 어떻게 작동하나요?

Bash 산술은 어떻게 작동하나요?
 read num1
 2
 read num2
 5
 echo "$((num1+num2))"
 7
 echo "$(($num1+$num2))"
 7

나는 언급했다이것.

위의 두 표현식이 어떻게 동일한 결과를 생성할 수 있는지 이해가 되지 않습니다. 설명 해주십시오.

    echo "$[num1+num2]" 

이 질문에서 제안한 대로 작동하지 않습니다. 내가 뭐 잘못 했어요?

    echo 'expr "$num1" + "$num2"` 

작동하지 않습니다. 몇 가지 제안을 해주세요.

답변1

산술 표현식을 평가하기 위해 쉘은 먼저 변수와 명령 대체를 확장합니다. 예를 들어 에서 echo "$(($num1+$num2))"가장 먼저 일어나는 일은 $num1과 가 $num2변수의 값으로 대체되는 것입니다. 표현식은 2+5산술 표현식으로 구문 분석되어 숫자 7로 평가됩니다. 구문 분석 및 확장의 결과 "$(($num1+$num2))"는 입니다 7.

산술 표현식에는 변수 이름이 포함될 수 있습니다. 이는 변수의 값으로 평가됩니다. 따라서 $((num1+num2))산술 표현식 num1+num2( $(($num1+$num2))그러나 산술 표현식 2+5)입니다. 이 경우 결과는 동일합니다.

num1or 의 값이 단순한 숫자 시퀀스 이상인 경우 num2두 표현은 다릅니다 . 예를 들어 다음 코드 조각을 고려해보세요.

a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"

두 번째 줄에서 평가할 산술 표현식은 입니다 1+2 * 4. 곱셈이 덧셈보다 우선순위가 높기 때문에 이는 1 + (2 × 4)로 구문 분석됩니다. 산술 평가가 발생하면 더하기 기호가 변수 확장에서 나온다는 사실이 잊혀집니다. 결과는 숫자 9이므로 echoprint 가 처음으로 호출됩니다 9.

세 번째 줄의 동작은 쉘에 따라 다릅니다. 일부 쉘(예: 대시)은 a유효한 숫자 값이 포함되어 있지 않다고 불평합니다 . 다른 쉘(예: ksh, bash, zsh)은 의 값을 a하위 표현식으로 처리하며, 이는 기본 표현식에서 사용할 값을 얻기 위해 평가됩니다. 즉, 이러한 다른 쉘에서는 의 값이 a로 평가되고 3산술 표현식이 3 × 4로 평가되므로 결과는 12입니다.

마지막으로 $[…]더 이상 사용되지 않는 비표준 변형이 있습니다 $((…)). 이 expr유틸리티는 쉘에 내장된 산술 구문이 없었던 시절로 거슬러 올라가 쉘 스크립트에서 산술 계산을 수행하는 오래된 방법입니다. expr "$num1" + "$num2"중복성과 마찬가지로 7을 인쇄합니다 echo `expr "$num1" + "$num2"`(따옴표 중 하나를 잘못 입력했습니다).

답변2

POSIX 쉘에서는산술 확장형식은 다음과 같습니다.

$((expression))

표현식에 변수가 포함되어 있고 해당 변수에 유효한 정수 값이 포함된 경우(앞에 더하기 또는 빼기 기호 사용 가능) 및는 "$((var))"동일한 "$(($var))"결과를 반환합니다(참고:쉘 산술 평가에서 원시 데이터 사용안전상의 위험을 초래할 수 있습니다).

시트$[표현식]POSIX에서 정의되지 않았으며 더 이상 사용되지 않으며 다음 버전의 bash.

이것표현유틸리티를 사용하여 산술 연산을 수행할 수 있습니다. 귀하의 경우 잘못된 구문을 사용하고 있습니다명령 대체, 이는 작은따옴표가 아닌 백틱입니다.

echo `expr "$num1" + "$num2"`

하지만 양식을 사용해야 합니다 "$()".

관련 정보