다음 내용으로 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`