((x++))를 루트로 실행하는 동안 오류가 발생했습니다.

((x++))를 루트로 실행하는 동안 오류가 발생했습니다.

다음 내용으로 bash 스크립트 temp.sh를 만듭니다.

age=0;
((age++));

일반 사용자로 실행하면 잘 작동됩니다.

하지만 루트로 실행하면 오류가 발생합니다.

./temp.sh: 4: ./temp.sh: age++: 찾을 수 없음

왜 그런 겁니까?

답변1

hashbang 없이 /bin/sh사용될 가능성이 높습니다 . 일부 POSIX 쉘은 ++and --연산자와 산술 평가를 지원 ((...))하지만 이것이 필수는 아닙니다.

귀하의 예에 hashbang을 포함하지 않았기 때문에 귀하가 hashbang을 사용하지 않는다고 가정하고 있으므로 귀하의 스크립트는 문제의 연산자를 지원하지 않는 POSIX 셸에서 실행될 수 있습니다. 이러한 셸은 두 개의 중첩된 하위 셸 내에서 실행되는 명령 ((age++))으로 해석됩니다 .age++

"일반" 사용자로 실행하면 bash나 연산자 및 를 지원하는 다른 쉘에 의해 해석될 수 있습니다 ((...)).

관련된:Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

이 문제를 해결하려면 스크립트에 hashbang을 추가하면 됩니다.

#!/bin/bash
age=0
((age++))

;참고: 행을 종료하기 위해 bash/shell에서 사용할 필요는 없습니다 .


스크립트를 모든 POSIX 셸에 이식하려면 다음 구문을 사용할 수 있습니다.

age=$((age + 1))
age=$((age += 1))

답변2

또 다른 오래된 답변(또는 다중 플랫폼 호환성이 뛰어남)은 다음과 같습니다.

 age=`expr $age + 1`

관련 정보