산술 확장 및 매개변수 확장

산술 확장 및 매개변수 확장
$ x=foo; foo=bar; bar=6; 

$ echo $x
foo

$ echo $((x))
6

산술 확장이 값 에서 멈추지 않고 변수에서 x값으로 foo, 변수에서 foo값으로 bar, 그리고 변수에서 값으로 추적되는 이유는 무엇입니까?foo6foox

정수에 도달하거나 아무 것도 도달하지 않을 때까지 eval 변수의 매개변수 확장에 산술 확장이 무한히 적용되는 것처럼 보입니까 ?x

답변1

bash이것은 산술 표현식에서 재사용하기 위해 쉘 변수에 유효하지 않은 정수 상수를 포함할 수 zsh있도록 하는 확장(및 그 파생물)입니다 .ksh

bash쉘 산술 에서:

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

따라서 귀하의 경우에는 $((x))먼저 잘못된 정수인 x으로 확장되므로 변수 이름 참조로 재사용됩니다. 그런 다음 으로 확장 하고 유효한 정수인 를 얻을 때까지 위 프로세스를 반복합니다 .foofoofoobar6


POSIX 사양에서는 $((x))유효한 정수 상수인 경우에만 $(($x))동일한 값이 반환된다고 명시합니다. 유효하지 않은 정수의 경우 x에 대해서는 아무 말도 하지 않으므로 쉘 구현에서는 이 경우를 자유롭게 처리할 수 있습니다.x

결과는 쉘마다 다를 수 있습니다.

zsh, ksh그리고 그 파생물은 bash위와 유사하게 동작합니다(비지박스도 마찬가지입니다 sh).

ash, 잘못된 정수가 포함된 경우 dash오류가 발생합니다.x

$ x=foo foo=bar bar=6 dash -c 'echo "$((x))"'
dash: 1: Illegal number: foo

yash변수를 그대로 둡니다.

$ x=foo foo=bar bar=6 yash -c 'echo "$((x))"'
foo

관련 정보