산술 확장은 $(달러) 기호가 없는 변수를 어떻게 처리합니까?

산술 확장은 $(달러) 기호가 없는 변수를 어떻게 처리합니까?

다음 줄은 다르게 작성해야 하며 명령에서 오류가 발생해야 한다고 생각합니다.

$ echo $((x=2, y=3, x+y))
5

제가 생각하는 작성 방법은 다음과 같습니다.

$ echo $((x=2, y=3, $x+$y))
5

둘 다 작동하는데 지금은 혼란스럽습니다. 어딘가 오해가 있는 것 같아서 첫 번째 에코가 잘못되었다고 어떻게 판단했는지 설명하겠습니다. x+y는 변수를 참조하지 않으므로 bash는 x와 y가 변수라는 것을 어떻게 알 수 있습니까? 이것이 표현식 시작 부분의 $ 때문이라고 말했다면 x와 y가 $x=2 및 $y=2에 정의되어 변수를 정의하는 잘못된 방법이기 때문에 틀린 것입니다. 그래서 나는 bash가 x와 y가 변수라는 것을 어떻게 아는지 전혀 모릅니다.

答え1

man bash, ARITHMETIC EVALUATION다음과 같이 설명합니다.

쉘 변수는 피연산자로 허용됩니다. 표현식이 평가되기 전에 매개변수 확장이 수행됩니다. 표현식 내에서 쉘 변수는 매개변수 확장 구문을 사용하지 않고도 이름으로 참조될 수도 있습니다. null이거나 설정되지 않은 쉘 변수는 매개변수 확장 구문을 사용하지 않고 이름으로 참조할 때 0으로 평가됩니다. 변수를 참조하면 변수의 값이 산술식으로 평가됩니다 [...]

에서는 $(())명령, 문자열 또는 쉘이 일반적으로 처리해야 하는 다른 어떤 것도 될 수 없으므로 변수를 확장합니다. 할당이 가능하므로 변수를 할당할 수 있습니다.

그러나 실제로 두 번째 예는 작동하지 않습니다.

$ echo $((x=2, y=3, $x+$y))
bash: x=2, y=3, +: syntax error: operand expected (error token is "+")
$ echo $((x=4, y=5, $x+$y))
5

첫 번째 시도에서는 x와 y가 아직 할당되지 않았습니다. 두 번째 시도에서는 이전에 할당된 값을 사용하므로 예상치 못한 결과(9 대신 5)를 얻습니다.

를 사용하면 $셸은 산술 평가가 수행되기 전에 산술 평가를 확장합니다. 따라서 할당은 산술 평가에서 너무 늦게 발생하여 $확장에 영향을 미치지 않습니다.

다음과 같은 이상한 작업을 수행할 수도 있습니다.

$ x=1+2+3
$ echo $x
1+2+3
$ echo $(($x*2))
9
$ echo $((x*2))
12

산술 평가 외부에서 변수를 할당하면 이는 단지 문자열일 뿐입니다. 그런 다음 셸을 사용하여 $문자열로 확장합니다. 그런 다음 산술 평가를 위해서는 연산자 우선순위를 처리해야 합니다.

그래서 결과는 1+2+3*2 = 9대신 입니다 6*2 = 12.

$ echo $((x=1+2+3, x*2))
12
$ echo $x
6

이 예에서는 산술 평가가 할당 전에 발생하므로 x=1+2+3 대신 x=6입니다.

関連情報