나는 모든 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: 산술 확장, 매개변수 확장 및 쉼표 연산자기다리다.