Writing Your First Shell Script
한국어 원문으로 표시합니다.
목표
셸 스크립트의 뼈대(셔뱅·실행 권한·인자·환경변수·조건 분기·종료 코드)를 한 바퀴 돌립니다.
왜 중요한가
스크립트는 사람이 아니라 다른 프로그램이 호출합니다. 그래서 출력 스트림과 종료 코드가 인터페이스입니다. 결과는 stdout, 오류와 사용법은 stderr, 성공/실패는 종료 코드 - 이 규약을 지켜야 result=$(script.sh) 같은 사용법이 성립하고 CI 가 실패를 감지할 수 있습니다. 사용법 안내를 stdout 으로 내보내는 순간 그것이 곧 결과값이 되어 버립니다. 그리고 설정은 환경변수로 넘기고 없으면 합리적인 기본값으로 도는 형태가 배포 자동화의 표준입니다.
단계
/root/bin/greet.sh를 만들고 첫 줄을#!/bin/bash로 하세요.- 그 파일에 실행 권한을 주세요.
greet.sh labhub를 실행하면 정확히Hello, labhub!를 출력하게 하세요.- 인자 없이 실행하면
Hello, world!가 되도록 기본값을 넣으세요. 인자를 주면 여전히 그 인자가 쓰여야 합니다. - 환경변수
GREETING이 설정돼 있으면 인사말을 그 값으로 바꾸세요.GREETING=Hi greet.sh labhub는Hi, labhub!, 설정이 없으면Hello,GREETING=Yo greet.sh는Yo, world!가 되어야 합니다. /root/bin/checkfile.sh <경로>를 만드세요. 일반 파일이면file, 디렉터리면dir, 없으면missing을 출력합니다./root/bin/grade.sh <점수>를 만드세요. 90 이상A, 80–89B, 70–79C, 그 미만F./root/bin/deploy.sh를 만드세요. 환경변수APP_ENV를 읽어서- 없으면 표준에러에 안내를 내고 종료 코드
2 prod/stage가 아닌 값이면 종료 코드3prod또는stage면deploying to <값>을 출력하고 종료 코드0
- 없으면 표준에러에 안내를 내고 종료 코드
참고
${1:-world}는 첫 번째 인자가 없거나 비었을 때만 world 를 씁니다.echo "메시지" >&2로 표준에러에 씁니다.- 흔한 실수 1: 5번에서 환경변수 기본값을 넣느라 위치 인자를 덮어쓰면 4번이 깨집니다. 둘은 독립적으로 동작해야 합니다.
- 흔한 실수 2: 7번에서
>=대신>를 쓰면 90 이 B 로 떨어집니다. 경계값을 하나씩 손으로 넣어 보세요.
스크립트 파일과 셔뱅
/root/bin/greet.sh 를 만들고 첫 줄을 #!/bin/bash 로 하세요.
첫 줄의 #! 는 커널에게 이 파일을 어떤 인터프리터로 실행할지 알려 주는 표시입니다.
실행 권한 주기
그 파일에 실행 권한을 주세요.
chmod +x 로 실행 비트를 켭니다.
인자를 받아 출력하기
greet.sh labhub 를 실행하면 정확히 Hello, labhub! 를 출력하게 하세요.
첫 번째 위치 인자는 $1 입니다. 쉼표와 느낌표 위치까지 정확히 맞춰야 합니다.
인자 기본값 처리
인자 없이 실행하면 Hello, world! 가 되도록 기본값을 넣으세요. 인자를 주면 여전히 그 인자가 쓰여야 합니다.
${1:-기본값} 문법을 쓰면 인자가 없을 때만 기본값이 쓰입니다. 인자가 있으면 그대로 살아 있어야 합니다.
환경변수로 인사말 바꾸기
환경변수 GREETING 이 설정돼 있으면 인사말을 그 값으로 바꾸세요. GREETING=Hi greet.sh labhub 는 Hi, labhub!, 설정이 없으면 Hello, GREETING=Yo greet.sh 는 Yo, world! 가 되어야 합니다.
환경변수와 위치 인자 둘 다 기본값 처리가 필요합니다. 서로 간섭하지 않아야 합니다.
파일 종류 판별하기
/root/bin/checkfile.sh <경로> 를 만드세요. 일반 파일이면 file, 디렉터리면 dir, 없으면 missing 을 출력합니다.
-f, -d 는 각각 일반 파일과 디렉터리를 검사합니다. 순서를 잘못 두면 디렉터리가 missing 으로 빠질 수 있습니다.
점수 등급 매기기
/root/bin/grade.sh <점수> 를 만드세요. 90 이상 A, 80–89 B, 70–79 C, 그 미만 F.
경계값이 함정입니다. 90 과 89, 80 과 79, 70 과 69 를 각각 손으로 확인하세요.
환경변수 검증과 종료 코드
/root/bin/deploy.sh 를 만드세요. 환경변수 APP_ENV 를 읽어서
- 없으면 표준에러에 안내를 내고 종료 코드
2 prod/stage가 아닌 값이면 종료 코드3prod또는stage면deploying to <값>을 출력하고 종료 코드0
표준출력과 표준에러를 구분하고, 상황별로 다른 종료 코드를 반환해야 합니다. exit 뒤의 숫자가 규약입니다.