여러 산술 관련 명령, Dash, POSIX shell, sh, Increment

여러 산술 관련 명령, Dash, POSIX shell, sh, Increment

POSIX 셸에서 변수를 사전/사후 증분할 때 이 두 예제의 차이점은 무엇입니까? 동일한 결과를 가져오는 것처럼 보이지만 사용 방법이 다를까요? 언제 다른 것보다 하나를 선호합니까?

X=$((X+1))

: $((X=X+1))

답변1

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

두 번째 예에서는 1 $((X=X+1))만큼 증가한 다음 ( 유효하고 짧지만 쉘에서 반드시 지원되는 것은 아님) 첫 번째 인수인 null 명령의 새 값으로 확장됩니다 . null 명령은 해당 인수를 무시하고 결과는 폐기됩니다(부작용 포함).X$((X++))$X:

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

  • 여기서 자주 발생하는 혼란스러운 질문에서 알 수 있듯이 null 명령은 모호하고 쉽게 오해됩니다.
  • 첫 번째 형식은 이전 평가 스타일과 다소 비슷하더라도 전체 쉘 구문 측면에서 더 자연스러워 보입니다.
  • 첫 번째 형식은 더 명확하고 간결하며 명령을 포함하지 않습니다.

하나의 명령의 환경만 수정하는 경우(예:

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

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

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

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

관련 정보