echo $a$((a=2))$a에서 매개변수 확장과 산술 확장 간의 역학

echo $a$((a=2))$a에서 매개변수 확장과 산술 확장 간의 역학

셸은 다음과 같습니다: GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)

다음 명령줄을 고려 중입니다.

a=1; echo $a$((a=2))$a

출력은 다음과 같습니다

122

확장 프로그램은 다음 순서로 처리되는 것으로 추측됩니다.

  1. 변수에는 a값이 할당됩니다 1.
  2. 첫 번째는 $a매개변수 확장으로 확장됩니다.a=1
  3. $((a=2)) 그런 다음 산술 확장을 수행하고 a 로 설정합니다 2.
  4. 그런 다음 두 번째 항목은 산술 확장에 설정된 새 값으로 $a확장 됩니다.a2

내 이해가 맞다면, 처리 순서는 쉘이 산술 확장을 한 후 매개변수 확장으로 돌아가는 것을 의미합니다.

이는 bash 확장에 명확한 순서가 있다는 GNU bash 매뉴얼에 대한 나의 이해와 모순됩니다. 산술 확장은 인수 확장 후에 수행됩니다.

여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있나요?

답변1

이는 bash 확장에 명확한 순서가 있다는 GNU bash 매뉴얼에 대한 나의 이해와 모순됩니다. 산술 확장은 인수 확장 후에 수행됩니다.

그러나 실제로는 그렇지 않습니다 man bash. 주의 깊게 읽으십시오:

확장 순서는 중괄호 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행됨)입니다.

쉼표와 세미콜론의 사용에 주의하세요. 물결표, 인수, 변수 및 산술 확장, 명령 대체는 모두 관찰된 동작에 따라 왼쪽에서 오른쪽으로 동일한 수준에서 발생합니다.


앞으로,POSIX 텍스트의 해당 부분에 더 명확한 형식이 있습니다.. 그것은 말한다:

단어 확장 순서는 다음과 같습니다.

  1. 물결표 확장, 매개변수 확장, 명령 대체 및 산술 확장은 처음부터 끝까지 수행되어야 합니다. 토큰 인식의 항목 5를 참조하세요.

  2. IFS가 비어 있지 않으면 1단계에서 생성된 필드 부분에 대해 필드 분할을 수행해야 합니다.

  3. set -f가 적용되지 않는 한 경로 이름 확장을 수행해야 합니다.

  4. 견적 삭제는 항상 마지막에 수행해야 합니다.

관련 정보