셸은 다음과 같습니다: GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)
다음 명령줄을 고려 중입니다.
a=1; echo $a$((a=2))$a
출력은 다음과 같습니다
122
확장 프로그램은 다음 순서로 처리되는 것으로 추측됩니다.
- 변수에는
a
값이 할당됩니다1
. - 첫 번째는
$a
매개변수 확장으로 확장됩니다.a=1
$((a=2))
그런 다음 산술 확장을 수행하고a
로 설정합니다2
.- 그런 다음 두 번째 항목은 산술 확장에 설정된 새 값으로
$a
확장 됩니다.a
2
내 이해가 맞다면, 처리 순서는 쉘이 산술 확장을 한 후 매개변수 확장으로 돌아가는 것을 의미합니다.
이는 bash 확장에 명확한 순서가 있다는 GNU bash 매뉴얼에 대한 나의 이해와 모순됩니다. 산술 확장은 인수 확장 후에 수행됩니다.
여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있나요?
답변1
이는 bash 확장에 명확한 순서가 있다는 GNU bash 매뉴얼에 대한 나의 이해와 모순됩니다. 산술 확장은 인수 확장 후에 수행됩니다.
그러나 실제로는 그렇지 않습니다 man bash
. 주의 깊게 읽으십시오:
확장 순서는 중괄호 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행됨)입니다.
쉼표와 세미콜론의 사용에 주의하세요. 물결표, 인수, 변수 및 산술 확장, 명령 대체는 모두 관찰된 동작에 따라 왼쪽에서 오른쪽으로 동일한 수준에서 발생합니다.
앞으로,POSIX 텍스트의 해당 부분에 더 명확한 형식이 있습니다.. 그것은 말한다:
단어 확장 순서는 다음과 같습니다.
물결표 확장, 매개변수 확장, 명령 대체 및 산술 확장은 처음부터 끝까지 수행되어야 합니다. 토큰 인식의 항목 5를 참조하세요.
IFS가 비어 있지 않으면 1단계에서 생성된 필드 부분에 대해 필드 분할을 수행해야 합니다.
set -f가 적용되지 않는 한 경로 이름 확장을 수행해야 합니다.
견적 삭제는 항상 마지막에 수행해야 합니다.