쉘 스크립트는 bash를 사용하여 실행되지만 sh는 사용하지 않습니다. 이유와 해결 방법은 무엇입니까?

쉘 스크립트는 bash를 사용하여 실행되지만 sh는 사용하지 않습니다. 이유와 해결 방법은 무엇입니까?

전달된 모든 인수를 요약하는 다음 쉘 스크립트가 있습니다(공백으로 구분).

sum=0
for arg in "$@"; do
    (( sum += arg ))
done
echo $sum

로 저장했습니다 SumAll.sh. 따라서 다음과 같이 작동해야 합니다.

sh SumAll.sh 2 4 6 8
20

또는

bash SumAll.sh 1 -2 3 -3
-1

둘 다 내 로컬 컴퓨터(MacBook)에서 작동하지만 Linux 서버에서 동일한 작업을 시도하면 bash작동하지만 sh작동하지 않는 스크립트를 실행합니다. 다음 오류가 발생합니다.

sum: '+=': No such file or directory
sum: arg: No such file or directory

왜 그런 겁니까? 어떻게 해결할 수 있나요?

답변1

산술 평가는 (( ... ))구현된 표준 POSIX 쉘 구문에 대한 확장입니다 bash. 대부분의 sh쉘은 이 구문을 이해하지 못합니다.

대신 산술 대체를 사용하세요.sum=$(( sum + arg ))

비표준을 구현하지 않는 쉘에서 명령 (( ... ))(( sum += arg ))중첩된 하위 쉘로 해석되고 sum두 개의 인수 +=와 함께 호출됩니다 arg.

macOS에는 sum파일의 체크섬을 계산하는 유틸리티가 있는데(참조) man sum파일을 찾을 수 없습니다(이것이 특정 오류가 발생하는 이유입니다).+=arg

답변2

사용주택 검사.

스크립트를 사용한 예:

#!/bin/bash
sum=0
for arg in "$@"; do
    (( sum += arg ))
done
echo $sum

결과:

$ shellcheck myscript

Line 6:
echo $sum
     ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
echo "$sum"

보시다시피 이것은 작동하지만 이전처럼 sh를 사용하는 경우:

#!/bin/sh
sum=0
for arg in "$@"; do
    (( sum += arg ))
done
echo $sum

결과:

$ shellcheck myscript

Line 4:
    (( sum += arg ))
    ^-- SC2039: In POSIX sh, standalone ((..)) is undefined.

Line 6:
echo $sum
     ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
echo "$sum"

SC2039오류(이 경우 첫 번째 오류)로 인해 여기서는 작동하지 않습니다.

당연하지만 이를 염두에 두어야 하며 sh구문 bash에는 몇 가지 차이점이 있습니다. 이것이 작동하지 않는 주된 이유입니다. (@kusalananda가 그의 답변에 자세히 설명되어 있음)

-x또한 스크립트가 언제 실패하는지 확인할 수 있도록 또는 디버그 플래그를 더 자주 사용해야 합니다 .

Bash 및 쉘 스크립팅에 대한 자세한 정보와 팁을 보려면 다음을 권장합니다.

-Bash의 비공식 위키

-배쉬 성경

관련 정보