CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
  • Week 12
  • Week 13
    • 1.네트워크 설정·진단 작업형: 손으로 IP를 세우고 길을 뚫는다
    • 2.서비스 설정파일 단답: 지시어 하나가 합격을 가른다
    • 3.셸 스크립트 작성형: 조건·반복·함수로 실무를 자동화한다
    • 4.보안·방화벽·로그 작업형: 규칙을 쓰고 컨텍스트를 바로잡는다
    • 5.네트워크·서비스 작업형 모의 + 오답노트
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 13/Day 3

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 13 · Day 3읽기 약 7분
핵심 정리
  • 작성형은 문법의 정확성을 본다. 한 글자 띄어쓰기가 곧 오답이 되는 영역이다.
  • 변수 대입 =의 양옆에 공백이 있으면 안 된다. 반대로 if [ 조건 ]의 대괄호 안쪽에는 공백이 있어야 한다.
  • 비교 연산자는 숫자 -eq/-gt/-lt, 문자열 =/!=/-z/-n, 파일 -e/-f/-d로 갈린다.
  • 종료 키워드: if→fi, for/while→done, case→esac. 함수는 괄호 없이 함수명 인자로 호출한다.
  • $(...)는 명령 치환, $((...))는 산술 연산, $?는 직전 명령의 종료 상태(0=성공)다.
  • 실무 3종 패턴은 통째로 외운다 — 백업(tar czf + $(date)), 파일 읽기(while read ...; done < 파일), 빈도 집계(sort | uniq -c | sort -rn).

Day 3 - 셸 스크립트 작성형: 조건·반복·함수로 실무를 자동화한다

스크립트의 뼈대: shebang·변수·실행

#!/bin/bash                 # shebang: 해석할 셸 지정 (첫 줄 필수)
 
name="linux"                # 변수 대입 (= 앞뒤 공백 금지!)
count=10
echo "$name $count"         # 변수 사용: $ 접두, "큰따옴표"로 보호
 
# 실행 권한 부여 후 실행
# chmod +x script.sh
# ./script.sh
규칙옳음틀림
변수 대입name="x"name = "x" (공백 X)
변수 참조$name, ${name}name
명령 치환$(date)(백틱은 가능하나 권장 X)
첫 줄#!/bin/bash없으면 기본 셸로 실행

⚠️ 함정: 변수 대입의 = 양옆에 공백이 있으면 안 된다. name = "x"는 name이라는 명령으로 해석돼 에러난다.

위치 매개변수와 특수 변수

$0      # 스크립트 이름
$1 $2   # 첫 번째, 두 번째 인자
$#      # 인자 개수
$@      # 모든 인자(개별)
$?      # 직전 명령의 종료 상태(0=성공)
$$      # 현재 프로세스 PID

종료 상태 $?: 직전 명령이 성공했으면 0, 실패면 0이 아닌 값. 조건 분기에서 가장 많이 쓰는 변수다.

조건문 if — 대괄호 안 공백이 생명

if [ "$count" -gt 5 ]; then
    echo "5보다 큼"
elif [ "$count" -eq 5 ]; then
    echo "5와 같음"
else
    echo "5보다 작음"
fi
  • [ 다음과 ] 앞에 반드시 공백이 있어야 한다([는 사실 test 명령이기 때문이다).
  • 비교 연산자도 숫자용과 문자열용이 다르다.
숫자 비교의미문자열 비교의미
-eq같다= / ==같다
-ne다르다!=다르다
-gt크다-z str길이 0(비었나)
-lt작다-n str길이>0(있나)
-ge크거나 같다
-le작거나 같다
  • 파일 검사 연산자도 필수다.
연산자참 조건
-e 파일존재한다
-f 파일일반 파일이다
-d 파일디렉터리다
-r/-w/-x읽기/쓰기/실행 가능

⚠️ 빈칸 함정: 숫자는 -gt/-lt/-eq, 문자열은 =/!=. 숫자에 >를 쓰면 리다이렉션으로 해석돼 의도와 달라진다.

반복문 for·while·case

# for: 목록 순회
for i in 1 2 3 4 5; do
    echo "번호 $i"
done
 
# for: C 스타일
for ((i=1; i<=5; i++)); do
    echo "$i"
done
 
# for: 파일 순회 (실무 단골)
for file in /var/log/*.log; do
    echo "처리: $file"
done
 
# while: 조건 동안 반복
count=1
while [ "$count" -le 5 ]; do
    echo "$count"
    count=$((count + 1))        # 산술 연산 $(( ))
done
 
# case: 다중 분기
case "$1" in
    start) echo "시작" ;;
    stop)  echo "중지" ;;
    *)     echo "사용법: $0 {start|stop}" ;;
esac
구조종료 키워드용도
for ... do ... donedone목록·범위 순회
while ... do ... donedone조건 동안 반복
case ... esacesac값에 따른 다중 분기

산술 연산: count=$((count + 1)) 또는 let count++. $(( )) 안에서는 $ 없이 변수명만 써도 된다.

case의 종료어는 esac(case 거꾸로), if는 fi. 거꾸로 읽는 종료 키워드를 정확히 알아야 한다.

함수 정의와 호출

# 함수 정의 (두 가지 문법)
backup() {
    echo "백업 시작: $1"        # 함수 인자도 $1, $2
    return 0                     # 종료 상태 반환(0~255)
}
 
function greet {
    echo "안녕 $1"
}
 
# 호출 (괄호 없이 인자 나열)
backup /etc
greet alice
  • 함수 인자는 스크립트처럼 $1, $2로 받는다.
  • return은 0~255의 종료 상태만 반환한다.
  • 값을 돌려주려면 echo로 출력한 뒤 $(함수호출)로 받는다.

호출 문법: 함수는 backup /etc처럼 괄호 없이 인자를 나열해 호출한다. backup(/etc)는 틀린 문법.

실무 예제 1 — 백업 스크립트

  • 날짜를 붙여 디렉터리를 tar로 묶어 백업하는 대표적인 패턴이다.
#!/bin/bash
# 사용법: ./backup.sh <백업할_디렉터리>
 
SRC="$1"
DATE=$(date +%Y%m%d)                 # 명령 치환으로 날짜
DEST="/backup/backup_${DATE}.tar.gz"
 
# 인자 검증
if [ -z "$SRC" ]; then
    echo "사용법: $0 <디렉터리>"
    exit 1
fi
 
# 디렉터리 존재 확인
if [ ! -d "$SRC" ]; then
    echo "오류: $SRC 디렉터리가 없습니다"
    exit 1
fi
 
# 백업 디렉터리 준비
[ -d /backup ] || mkdir -p /backup
 
# 압축 백업
tar czf "$DEST" "$SRC"
 
# 결과 확인
if [ $? -eq 0 ]; then
    echo "백업 성공: $DEST"
else
    echo "백업 실패"
    exit 1
fi
  • 여기서 핵심은 다음 조합의 정확성이다.
  • -z(빈 인자 검사), ! -d(디렉터리 없음), $(date +%Y%m%d)(명령 치환), $?(tar 성공 확인), tar czf(c 생성·z gzip·f 파일).

[ -z "$SRC" ]에서 변수를 "큰따옴표"로 감싸지 않으면 인자가 비었을 때 [ -z ]가 되어 문법 오류가 난다. 항상 변수는 따옴표로 보호한다.

실무 예제 2 — 사용자 일괄 생성

  • 파일에서 사용자 목록을 읽어 계정을 만드는 패턴이다.
  • while read가 핵심이다.
#!/bin/bash
# userlist.txt 각 줄에 사용자명 하나씩
 
USERLIST="userlist.txt"
 
while read username; do
    # 이미 있는 계정은 건너뜀
    if id "$username" &>/dev/null; then
        echo "$username 이미 존재 — 건너뜀"
    else
        useradd "$username"
        echo "$username:initpass" | chpasswd   # 초기 암호 설정
        echo "$username 생성 완료"
    fi
done < "$USERLIST"                              # 파일을 입력으로
  • while read 변수; do ... done < 파일은 파일을 한 줄씩 읽는 표준 관용구다.
  • done < 파일로 입력을 리다이렉션하는 위치를 정확히 기억해야 한다.
  • id "$user" &>/dev/null로 계정 존재 여부를 조용히 확인한다.

파일 한 줄씩 읽기: while read line; do ... done < file. 리다이렉션 < file은 done 뒤에 붙인다 — 시험에서 빈칸이 되기 쉽다.

실무 예제 3 — 로그 파싱

  • 로그에서 특정 패턴을 집계하는 패턴이다.
  • 텍스트 처리 도구와의 결합이 핵심이다.
#!/bin/bash
# 로그에서 접속 실패 IP를 횟수순으로 집계
 
LOG="/var/log/secure"
 
if [ ! -f "$LOG" ]; then
    echo "로그 파일이 없습니다: $LOG"
    exit 1
fi
 
echo "=== 인증 실패 상위 IP ==="
grep "Failed password" "$LOG" \
    | awk '{print $(NF-3)}' \
    | sort | uniq -c | sort -rn | head -5
도구역할
grep "패턴"패턴 줄만 추출
awk '{print $N}'N번째 필드 출력
sort정렬
uniq -c중복 제거 + 개수 카운트
sort -rn숫자 내림차순
head -5상위 5개
  • sort | uniq -c | sort -rn은 빈도 집계의 황금 조합이다.
  • uniq는 정렬된 입력에서만 제대로 동작하므로 앞에 sort가 반드시 와야 한다.

집계 관용구: sort | uniq -c | sort -rn = "같은 값 묶어 세고, 많은 순으로". uniq 앞에는 항상 sort.

입력 받기와 논리 연산

  • 사용자 입력과 논리 결합도 작성형에 자주 끼어든다.
read -p "이름을 입력: " name        # -p로 프롬프트 표시 후 입력
read -sp "암호: " pw                # -s로 입력 숨김(에코 off)
 
# 논리 결합
if [ "$a" -gt 0 ] && [ "$b" -gt 0 ]; then echo "둘 다 양수"; fi
if [ "$a" -eq 0 ] || [ "$b" -eq 0 ]; then echo "하나라도 0"; fi
[ -f "$f" ] && echo "있음" || echo "없음"   # 단축 평가
연산의미
&&앞이 성공(참)이면 뒤 실행
||앞이 실패(거짓)면 뒤 실행
!부정

단축 평가 관용구: 명령 && 성공시명령 || 실패시명령. mkdir -p /backup 같은 준비 작업에 [ -d /backup ] || mkdir /backup을 자주 쓴다.

cron으로 스크립트 자동 실행

  • 작성한 스크립트를 주기적으로 돌리는 것까지가 실무 마무리다.
  • crontab 필드는 분 시 일 월 요일 순서다.
crontab -e        # 현재 사용자 크론 편집
crontab -l        # 등록된 크론 조회
# 분 시 일 월 요일  명령
0   2   *  *  *    /root/backup.sh /etc    # 매일 02:00 백업
30  3   *  *  0    /root/weekly.sh         # 매주 일요일 03:30
*/10 *  *  *  *    /root/check.sh          # 10분마다
필드범위특수기호
분0-59*(매번)
시0-23,(나열)
일1-31-(범위)
월1-12*/N(N마다)
요일0-7(0·7=일)

요일 0과 7: 둘 다 일요일이다. */10 * * * *는 10분마다, 0 2 * * *는 매일 새벽 2시. 백업 스크립트는 보통 한가한 새벽 시간에 cron으로 건다.

스크립트 디버깅과 종료

bash -x script.sh        # 실행 추적(각 줄 출력) — 디버깅 핵심
bash -n script.sh        # 문법만 검사(실행 안 함)
set -e                   # 오류 시 즉시 중단
set -u                   # 미정의 변수 사용 시 오류
 
exit 0                   # 성공 종료 (관례: 0=성공)
exit 1                   # 실패 종료 (0 아닌 값=실패)

디버깅: bash -x는 실행되는 모든 명령을 + 접두로 보여 줘 어디서 틀렸는지 추적한다. set -e는 한 줄이라도 실패하면 즉시 멈춘다.

배열과 문자열 처리

  • 기본 문법 외에 작성형에서 종종 요구되는 배열·문자열 다루기도 정리해 둔다.
# 배열
arr=(apple banana cherry)
echo "${arr[0]}"          # 첫 원소: apple
echo "${arr[@]}"          # 전체 원소
echo "${#arr[@]}"         # 원소 개수: 3
for x in "${arr[@]}"; do echo "$x"; done
 
# 문자열 길이·자르기
str="linuxmaster"
echo "${#str}"            # 길이: 11
echo "${str:0:5}"         # 부분: linux (시작:길이)
echo "${str/master/king}"  # 치환: linuxking
표기의미
${arr[i]}i번째 원소
${arr[@]}전체 원소
${#arr[@]}원소 개수
${#str}문자열 길이
${str:n:m}n부터 m글자

${#...}의 두 얼굴: 배열에 쓰면 원소 개수, 일반 변수에 쓰면 문자열 길이다. ${#arr[@]}(개수) vs ${#str}(길이)를 구분한다.

직접 쳐보기

  • 작은 스크립트를 직접 만들어 문법 감각을 기른다.
# 1) 인자 개수와 종료상태 확인
cat > t.sh <<'EOF'
#!/bin/bash
echo "인자 개수: $#"
echo "첫 인자: $1"
[ -f "$1" ] && echo "파일 존재" || echo "파일 없음"
EOF
chmod +x t.sh
./t.sh /etc/hostname
 
# 2) 문법 검사와 추적 실행
bash -n t.sh
bash -x t.sh /etc/passwd

bash -x로 추적하며 손에 익히는 것이 합격의 지름길이다.

📖 용어

  • shebang(#!/bin/bash) : 스크립트 첫 줄에 어떤 셸로 해석할지 적는 표시.
  • 명령 치환 $(...) : 명령의 출력을 값으로 바꿔 넣는 문법. 예: DATE=$(date +%Y%m%d).
  • 산술 연산 $((...)) : 괄호 안을 계산해 값으로 바꾸는 문법. 안에서는 변수에 $를 안 붙여도 된다.
  • $?(종료 상태) : 직전 명령의 성공 여부. 0이 성공, 0이 아니면 실패다.
  • 위치 매개변수 : 스크립트나 함수에 넘어온 인자. $1·$2로 받고 $#이 개수다.
  • test / [ ] : 조건을 판정하는 명령. 대괄호가 명령이라서 안쪽에 공백이 꼭 필요하다.
  • -z / -n : 문자열이 비었는지 / 비어 있지 않은지 검사하는 연산자.
  • -f / -d / -e : 일반 파일인지 / 디렉터리인지 / 존재하는지 검사하는 연산자.
  • esac : case 블록을 닫는 키워드. case를 거꾸로 쓴 것이다(if↔fi와 같은 방식).
  • while read ... done < 파일 : 파일을 한 줄씩 읽어 처리하는 표준 관용구. 리다이렉션은 done 뒤에 붙인다.
  • sort | uniq -c | sort -rn : 값별 빈도를 세어 많은 순으로 정렬하는 집계 관용구. uniq 앞에는 반드시 sort.
  • 단축 평가 && / || : 앞 명령이 성공하면 뒤를 실행 / 실패하면 뒤를 실행하는 논리 결합.
  • bash -x / bash -n : 실행되는 줄을 추적 출력하는 디버깅 / 실행 없이 문법만 검사하는 모드.
  • set -e / set -u : 명령이 하나라도 실패하면 즉시 중단 / 정의되지 않은 변수를 쓰면 오류로 처리.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 중 셸 변수 대입으로 올바른 것은?

문제 2

if [ "$x" -gt 10 ]에서 -gt가 의미하는 것은?

문제 3

디렉터리가 존재하는지 검사하는 test 연산자는?

문제 4

파일을 한 줄씩 읽어 처리하는 다음 구문의 빈칸에 들어갈 것은? while read line; do echo "$line"; done ____ data.txt

문제 5

case 문을 종료하는 키워드는?

문제 6

직전에 실행한 명령의 성공/실패 종료 상태를 담는 특수 변수는?

문제 7

빈도 집계를 위해 sort | uniq -c | sort -rn 조합에서 uniq 앞에 반드시 sort가 와야 하는 이유는?

이전서비스 설정파일 단답: 지시어 하나가 합격을 가른다Week 13 · Day 2다음 보안·방화벽·로그 작업형: 규칙을 쓰고 컨텍스트를 바로잡는다Week 13 · Day 4

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • 스크립트의 뼈대: shebang·변수·실행
  • 위치 매개변수와 특수 변수
  • 조건문 if — 대괄호 안 공백이 생명
  • 반복문 for·while·case
  • 함수 정의와 호출
  • 실무 예제 1 — 백업 스크립트
  • 실무 예제 2 — 사용자 일괄 생성
  • 실무 예제 3 — 로그 파싱
  • 입력 받기와 논리 연산
  • cron으로 스크립트 자동 실행
  • 스크립트 디버깅과 종료
  • 배열과 문자열 처리
  • 직접 쳐보기
  • 용어
  • 연습 문제