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
)입니다. 이 경우 결과는 동일합니다.
num1
or 의 값이 단순한 숫자 시퀀스 이상인 경우 num2
두 표현은 다릅니다 . 예를 들어 다음 코드 조각을 고려해보세요.
a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"
두 번째 줄에서 평가할 산술 표현식은 입니다 1+2 * 4
. 곱셈이 덧셈보다 우선순위가 높기 때문에 이는 1 + (2 × 4)로 구문 분석됩니다. 산술 평가가 발생하면 더하기 기호가 변수 확장에서 나온다는 사실이 잊혀집니다. 결과는 숫자 9이므로 echo
print 가 처음으로 호출됩니다 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"`
하지만 양식을 사용해야 합니다 "$()"
.