$ x=foo; foo=bar; bar=6;
$ echo $x
foo
$ echo $((x))
6
산술 확장이 값 에서 멈추지 않고 변수에서 x
값으로 foo
, 변수에서 foo
값으로 bar
, 그리고 변수에서 값으로 추적되는 이유는 무엇입니까?foo
6
foo
x
정수에 도달하거나 아무 것도 도달하지 않을 때까지 eval
변수의 매개변수 확장에 산술 확장이 무한히 적용되는 것처럼 보입니까 ?x
답변1
bash
이것은 산술 표현식에서 재사용하기 위해 쉘 변수에 유효하지 않은 정수 상수를 포함할 수 zsh
있도록 하는 확장(및 그 파생물)입니다 .ksh
쉘 변수는 피연산자로 허용됩니다. 매개변수 확장은 표현식 평가 전에 수행됩니다. 표현식 내에서 쉘 변수는 매개변수 확장 구문을 사용하지 않고도 이름으로 참조될 수도 있습니다. null이거나 설정되지 않은 쉘 변수는 매개변수 확장 구문을 사용하지 않고 이름으로 참조할 때 0으로 평가됩니다. 변수가 참조되거나 "declare -i"를 사용하여 정수 속성이 할당된 변수에 값이 할당되면 변수의 값은 산술 표현식으로 평가됩니다. null 값은 0으로 평가됩니다. 셸 변수는 정수 속성을 설정하지 않고도 표현식에서 사용할 수 있습니다.
따라서 귀하의 경우에는 $((x))
먼저 잘못된 정수인 x
으로 확장되므로 변수 이름 참조로 재사용됩니다. 그런 다음 으로 확장 하고 유효한 정수인 를 얻을 때까지 위 프로세스를 반복합니다 .foo
foo
foo
bar
6
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