$( ((expression)) ) 와 $(((expression))) 의 차이점은 무엇입니까?

$( ((expression)) ) 와 $(((expression))) 의 차이점은 무엇입니까?

왜 출력이 다른가요?

echo $( (( 5+5 )) )

echo $((( 5+5 )))
10

답변1

bash활성화된 상태에서 명령을 실행합니다 set -x.

$ set -x
$ echo $( (( 5+5 )) )
++ ((  5+5  ))
+ echo

$ echo $((( 5+5 )))
+ echo 10
10
$ echo $(( ( 5+5 ) ))
+ echo 10
10

보시다시피 $(...)첫 번째 명령의 명령은 명령 대체로 처리됩니다. 이 명령은 실행 명령을 대체합니다 ((5+5)). 이는 출력이 없는 산술 평가이므로 echo어떠한 인수도 사용하지 않고 개행 문자만 사용합니다.

다른 경우(그리고 제가 추가한 추가 사례)는 $((...))산술 확장으로 처리됩니다. 이 계산의 값은 (5+5)해당 계산의 결과로 대체됩니다.

bash혼란을 피하기 위해 위의 마지막 명령에서 보여준 것처럼 파서가 사용하려는 구문 그룹화 유형을 확인할 수 있도록 공백을 사용하는 것이 좋습니다 .

답변2

$( (( 5+5 )) )5+5내부 산술 표현식입니다.산술 복합 명령 (( … ))내부에 하나명령 대체 $( … ). 산술 복합 명령은 출력을 생성하지 않으므로 명령 대체 결과는 비어 있습니다. 산술 복합 명령은 할당(명령에 할당이 없음) 또는 해당 반환 값(여기에서는 사용되지 않음)에만 유용합니다.

$((( 5 + 5 )))또는 내부 $(( ( 5+5 ) ))산술 표현식( 5 + 5 )산술 확장 $(( … )). 산술 확장의 결과는 숫자 값입니다(10진수 형식으로 표시).

관련 정보