셸 스크립트 (운영 자동화)
5. 자주 하는 실수 (Tip)
❌ 실수 1: set -e 없이 cd 뒤에 rm -rf 를 쓴다
cd 가 실패하면 현재 폴더에서 rm -rf * 가 돌아갑니다. ✅ set -e 를 켜고, 그래도 cd "$DIR" || exit 1 처럼 명시합니다.
❌ 실수 2: 변수를 따옴표 없이 쓴다
rm $FILE 에서 파일명에 공백이 있으면 두 파일을 지우려 합니다. ✅ 항상 "$FILE" 입니다. shellcheck 가 이걸 전부 잡아 줍니다.
❌ 실수 3: for line in $(cat file) 로 줄을 읽는다
공백마다 쪼개져 한 줄이 여러 번 돕니다. ✅ while IFS= read -r line; do ...; done < file 을 씁니다.
❌ 실수 4: [ $n > 3 ] 로 숫자를 비교한다
> 는 리다이렉션이라 3 이라는 파일이 생기고 조건은 항상 참입니다. ✅ 숫자는 -gt, 문자열은 = 입니다. [[ ]] 안에서는 > 가 문자열 비교입니다.
❌ 실수 5: set -e 가 함수 안 파이프에서도 멈출 거라 믿는다
grep x file | sort 에서 grep 이 실패해도 파이프는 성공입니다. ✅ set -o pipefail 을 함께 켭니다.
❌ 실수 6: 종료 코드를 확인하지 않고 다음 단계로 간다
scp 가 실패했는데 restart 를 해 빈 jar 로 뜹니다. ✅ set -e 로 멈추게 하거나 cmd || die "복사 실패" 로 명시합니다.
❌ 실수 7: 임시 파일을 고정 이름으로 만든다
두 번 동시에 돌면 서로 덮어씁니다. /tmp/out.txt 를 다른 사용자가 미리 만들어 둘 수도 있습니다. ✅ mktemp 로 만들고 trap EXIT 로 지웁니다.
❌ 실수 8: exit 대신 return 을 최상위에서 쓰거나 그 반대
함수 밖 return 은 에러이고, 함수 안 exit 는 스크립트 전체를 끝냅니다. ✅ 함수는 return, 스크립트는 exit 입니다. die 만 예외로 함수 안에서 exit 합니다.
❌ 실수 9: Windows 에서 편집해 CRLF 로 올린다
bash: /usr/bin/env: 'bash\r': No such file 로 첫 줄부터 실패합니다. ✅ sed -i 's/\r$//' 파일 또는 dos2unix 로 바꾸고, 에디터 줄 끝을 LF 로 둡니다. 이 사이트의 스크립트도 같은 이유로 LF 로 저장돼 있습니다.
❌ 실수 10: 스크립트를 sh 로 실행한다
sh script.sh 는 RHEL 에서 bash 의 POSIX 모드라 [[ ]], 배열, ${var//} 가 실패합니다. ✅ bash script.sh 또는 실행 권한을 주고 ./script.sh 로 shebang 을 따르게 합니다.