산술 확장이 Bash에서는 작동하지만 Zsh에서는 작동하지 않는 이유는 무엇입니까?

산술 확장이 Bash에서는 작동하지만 Zsh에서는 작동하지 않는 이유는 무엇입니까?

나는 수업 시간에 학생들에게 흥미로운 코드를 보여 주었고 놀랍게도 작동했습니다 zsh. 그런 다음 으로 전환하여 bash예상대로 작동했습니다.

코드는 아래와 같이 표시됩니다.

[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"

예상대로 bash인쇄되거나 Boom무작위 Click로 인쇄됩니다. 하지만 zsh다음과 같은 오류 메시지가 나타납니다.

zsh:= 찾을 수 없음

차이점이 무엇인지 설명할 수 있는 사람이 있나요? 내가 이해한 바로는 두 쉘 모두 스크립트를 동일한 방식으로 해석해야 합니다.

감사해요.

답변1

시도해보고 unsetopt equals다시 시도해 보세요. 또는 첫 번째 같음 문자 주위에 따옴표를 넣으세요.

for 조건을 사용하면 [모든 매개변수가 정상적으로 평가되며 단어 시작 부분에 있는 =는 명령 위치를 가져오는 데 유용한 zsh 단축어입니다. 예를 들어 =ls, /bin/ls주어진 ==zsh find =명령을 찾을 수 없습니다.

posix 모드(sh 시뮬레이션)에서 Zsh와 bash 간의 호환성이 훨씬 더 좋아질 것입니다. 호환되는 부분이 많고 배운 대부분의 bash 지식은 여전히 ​​유용하지만 이식 가능한 스크립트를 작성하려면 알아야 할 몇 가지 사항이 있습니다.

[내장된 this 와 달리 [[파서가 이해하는 예약어이므로 문제가 덜 발생합니다. 그러나 이 경우에는 산술 모드를 사용하므로 단순화할 수 있습니다.

    (( RANDOM % 6 == 0 )) && echo "Boom" || echo "Click"

실제로, 0과의 비교는 심지어 중복됩니다. 왜냐하면 기본 반환 상태는 값이 0인지 여부를 반영하기 때문입니다. 비록 반대의 의미를 갖고 있지만 말입니다:

    (( RANDOM % 6 )) && echo "Click" || echo "Boom"

관련 정보