POSIX Shell에서 변수를 사전/사후 증가시킬 때 이 두 예제의 차이점은 무엇입니까? 동일한 결과를 가져오는 것처럼 보이지만 다르게 사용됩니까? 언제 다른 것보다 하나를 선호합니까?
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
이는 원하는 부작용이 있고 한 줄을 절약하며 매우 명확합니다.