전달된 모든 인수를 요약하는 다음 쉘 스크립트가 있습니다(공백으로 구분).
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 및 쉘 스크립팅에 대한 자세한 정보와 팁을 보려면 다음을 권장합니다.