몇 가지 산술 관련 명령, Dash, POSIX shell, sh, Increment 때 POSIX Shell에서이 두 예의 차이점은 무엇입니까?

변수를 사전 / 사후 증분 할 때 POSIX Shell에서이 두 예의 차이점은 무엇입니까? 그들은 같은 결과를 낳는 것처럼 보이지만 다르게 사용됩니까? 언제 다른 것을 선호합니까?

X=$((X+1))

: $((X=X+1))


답변

첫 번째 예에서는 $((X+1))표현식 X + 1을 평가하고 결과로 확장 된 다음 변수에 할당됩니다.

두 번째 예제에서는 1 $((X=X+1))씩 증가 X( $((X++))유효하고 짧지 만 쉘에서 반드시 지원하지는 않음) 한 다음 새로운 값인으로 확장됩니다. $X이는 널 명령에 대한 첫 번째 인수 :입니다. null 명령은 인수를 무시하고 결과는 부작용과 함께 무시됩니다.

나는 세 가지 (상대적으로 주관적인) 이유 때문에 개인적으로 첫 번째 형식을 선호합니다.

  • null 명령은 종종 혼란스러운 질문의 주제로 표시되는 바와 같이 모호하고 잘못 이해됩니다.
  • 첫 번째 형식은 전체 셸 문법 측면에서 더 자연스럽게 보이고 심지어 이전 평가 스타일과 약간 비슷합니다.
  • 첫 번째 형식은 더 명확하고 간결하며 명령이 필요하지 않습니다.

다음과 같은 하나의 명령으로 환경을 수정하는 경우 첫 번째 버전을 사용해야합니다

X=$((X+1)) /usr/local/bin/something

인수에 직접 평가를 추가하려면 두 번째 양식을 사용해야합니다.

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

이것은 원하는 부작용이 있고 한 줄을 절약하며 매우 분명합니다.