모든 POSIX 쉘은 산술 확장 $((...)) 을 같은 방식으로 구현합니까? [복사]

모든 POSIX 쉘은 산술 확장 $((...)) 을 같은 방식으로 구현합니까? [복사]

나는 모든 POSIX 쉘에서 작동하는 쉘 스크립트를 작성하려고 하는데 dash이것이 다른 POSIX 호환 쉘에서 작동하기 위해 의존할 수 있는 것인지, 아니면 단지 종속성인지 궁금합니다. dash쉘의 의도하지 않은 기능입니다.

산술 확장에서 변수는 초기 달러 기호가 있거나 없이 작성될 수 있습니다(항상 달러 기호 등으로 작성되어야 하는 위치 인수의 경우는 제외 $1) $2.

하지만 내가 발견한 동작은 확장 프로그램의 경우와는 "$((X))"다릅니다."$(($X))""$(($X))"두 배,그리고 한 번만이 아닙니다. 즉, 내 변수 에 다음이 X포함된 경우다른 변수의 이름( X=Y)에는 숫자 값( Y=1) 이 포함되어 있으며 "잘못된 숫자: Y" 오류와 함께 "$(($X))"반환 1됩니다 ."$((X))"

이 동작이 다른 POSIX 셸에서도 동일하다고 믿을 수 있습니까?

이상한 행동

"$((X))"그리고 "$(($X))"다르게 행동하십시오.

$ X=Y; Y=1
$ echo "$((X))"
dash: 1: Illegal number: Y
$ echo "$(($X))"
1

예상되는 동작

완전성을 기하기 위해 여기에는 간접 참조가 없고 두 가지 수준의 간접 참조가 포함됩니다. 간접적인 방법은 없으며 모든 것이 예상대로 작동합니다.

$ X=1
$ echo "$((X))"
1
$ echo "$(($X))"
1

예상한 대로 두 가지 수준의 간접 참조는 작동하지 않습니다(오류 메시지는 다른 값을 나타냅니다).

$ X=Y; Y=Z; Z=1
$ echo "$((X))"
dash: 6: Illegal number: Y
$ echo "$(($X))"
dash: 7: Illegal number: Z

이 질문은 이 질문과 다소 관련이 있습니다.산술 확장 및 매개변수 확장하지만 더 높은 수준의 쉘의 동작을 처리하기 때문에 동일하지는 않지만 bash예상되는 POSIX 동작을 알고 싶습니다.

답변1

귀하의 질문은 POSIX 관련 질문이고 관련 질문에 고급 쉘이 포함된 것 같으므로 이 질문에 별도로 답변하겠습니다.

당신이 보고 있는 동작은 두 가지 다른 종류의 확장, 즉 매개변수 확장과 산술 확장에서 비롯됩니다.POSIX는 이 순서로 지정합니다.. 그리고

$ X=Y; Y=1

첫 번째 예에서는 산술 확장만 사용합니다.

$ echo "$((X))"

값을 X산술 표현식으로 해석하려고 시도했지만 "Y"가 숫자가 아니기 때문에 실패했습니다.

두 번째 예에서는 다음을 모두 사용합니다.

$ echo "$(($X))"

다음으로 확장(매개변수 확장)됩니다.

$ echo "((Y))"

그런 다음 산술 확장에서는 Y값 1을 사용합니다.

당신은 또한 볼 수 있습니다산술 표현식에서 간접 확장을 사용한 변수 확장의 두 가지 예에 대해 알아보세요.그리고Bash: 산술 확장, 매개변수 확장 및 쉼표 연산자기다리다.

관련 정보