[리눅스] Shell 스크립트

이지연·2025년 11월 19일
post-thumbnail

개요

이번 포스팅에서는 리눅스에서 자주 사용하는 Shell 스크립트의 기본 개념과 스크립트 파일 구조, 실행 방법, 그리고 가장 많이 쓰이는 if, for 문 예제를 실제 코드 중심으로 정리해보겠다.


파일 종류와 실행 파일 개념

리눅스에서 파일은 크게 두 가지 관점으로 볼 수 있다.

  • 편집 가능한 파일 (텍스트 파일, 설정 파일 등)
  • 실행 가능한 파일 (바이너리, 스크립트 등)

예를 들어:

  • IntelliJ.exe : 윈도우 기준 실행 파일 (더블클릭 또는 명령으로 실행)
  • index.txt : 메모, 설정 등을 적어두는 일반 텍스트 파일

리눅스에서는 확장자가 실행 여부를 결정하지 않는다. 대신,

  • 해당 파일에 실행 권한(x) 이 있는지
  • 그 파일의 내용이 실행 가능한 형식(바이너리, 스크립트 등) 인지가 더 중요하다.

즉, .sh 가 아니어도 실행 권한과 올바른 내용만 있으면 “실행 파일”이 될 수 있다.


Shell 스크립트 기본 규칙

1) 확장자

  • 관례적으로 .sh 확장자를 많이 사용한다.
  • 예) myscript.sh, deploy.sh, backup.sh

확장자는 사람과 도구가 “이건 쉘 스크립트구나”라고 알아보기 쉽게 하기 위한 용도일 뿐, 필수는 아니다.

2) 실행 방법

현재 디렉터리에 있는 스크립트를 실행할 때는 보통 이렇게 쓴다.

./myscript.sh
  • ./ 는 “현재 디렉터리”를 의미한다.
  • 그냥 myscript.sh 만 치면 PATH에 현재 디렉터리가 포함되지 않은 경우 실행이 되지 않을 수 있다.

3) 실행 권한 필요

스크립트를 실행하기 전에 실행 권한(x) 을 부여해야 한다.

chmod u+x myscript.sh
  • u : 현재 사용자(user)
  • +x : 실행 권한 추가

권한을 주고 나면 ./myscript.sh 로 바로 실행이 가능해진다.

4) 스크립트 상단 shebang

실제 스크립트를 작성할 때는 shebang(해시뱅)을 맨 위에 적어주는 것이 좋다.

#!/bin/bash
  • 이 파일이 bash 로 실행되어야 한다는 의미다.
  • 시스템에 따라 /bin/sh, /usr/bin/env bash 등 다른 형태를 쓰기도 한다.

[📝실전연습] 요구사항
1. /jiyean_dir 위치에 myscript.sh의 쉘 스크립트 생성
2. myscript 스크립트 요구사항
2-1. 스크립트 실행 시 script start 문자열 출력 & 스크립트 종료 시 script end 문자열 출력
2-2. 홈 디렉터리로 이동 후 mydir 폴더 생성
2-3. mydir로 이동 후 file1.txt, file2.txt 생성
2-4. 각각의 파일 내부에 hello Im from file1/file2 문자열 작성

/jiyean_dir에서 myscript.sh를 생성 후 실행한 화면 → 2-1 요구사항 충족 완료
home/jiyean/mydir 위치에서 file1.txt과 file2.txt cat 실행한 화면 → 2-2~2.4 요구사항 충족 완료

if 문 기본 문법

Shell 스크립트에서 조건 분기에는 if ~ elif ~ else ~ fi 구조를 사용한다.

if [ 조건 ]; then
    # 조건이 참일 때 실행
elif [ 다른 조건 ]; then
    # 첫 번째 조건은 거짓이고, 두 번째 조건이 참일 때 실행
else
    # 모든 조건이 거짓일 때 실행
fi

비교 연산 예시

  • 정수 비교

    • -eq : 같음 (==)
    • -ne : 다름 (!=)
    • -gt : 보다 큼 (>)
    • -lt : 보다 작음 (<)
    • -ge : 크거나 같음 (>=)
    • -le : 작거나 같음 (<=)
    • 예) [ 1 -gt 2 ] → 1 > 2 ?
  • 문자열 비교

    • = : 문자열이 같음
    • != : 문자열이 다름
    • -z : 길이가 0인지
    • -n : 길이가 0보다 큰지

괄호 [ ] 안과 바깥의 공백, 연산자 앞뒤 공백을 반드시 지켜주는 것이 중요하다.


if 예제 1: 숫자 비교

#!/bin/bash

# gt: greater than (보다 큰)
# lt: less than   (보다 작은)

if [ 1 -gt 2 ]; then
    echo "hello world"
else
    echo "bye world"
fi
  • 조건 [ 1 -gt 2 ] 는 거짓이므로, 실제 출력은 bye world가 된다.
  • 숫자 비교 문법 감각을 익히기에 가장 단순한 예제다.

변수 선언 및 파일/디렉터리 검사

변수 선언 & 사용

Shell 스크립트에서 변수는 아래처럼 선언한다.

변수명=값      # = 양쪽에 공백 없음

사용할 때는 $변수명 형태로 참조한다.

file_name="first_file.txt"
echo "$file_name"
  • 문자열 안에서는 "${변수명}" 또는 "$변수명" 형태로 감싸서 사용하는 것이 안전하다.

파일/디렉터리 존재 여부 검사

파일, 디렉터리 존재 여부는 -f, -d 와 같은 테스트 옵션으로 확인할 수 있다.

  • -f : 일반 파일이 존재하는지 확인
  • -d : 디렉터리가 존재하는지 확인
#!/bin/bash

file_name="first_file.txt"

if [ -f "$file_name" ]; then
    echo "$file_name exists!"
else
    echo "$file_name does not exist!"
fi
  • "first_file.txt" 라는 이름의 파일이 있으면 exists!, 없으면 does not exist!를 출력한다.
  • 비슷한 방식으로 디렉터리에 대해서는 -d "$dir_name" 을 사용할 수 있다.

for 문 기본 문법

반복문에는 for ~ in ~ do ~ done 구조를 사용한다.

for 변수 in 항목들; do
    # 반복해서 실행할 명령
done

항목들 자리에 올 수 있는 것들:

  • 직접 나열한 값들
    for x in a b c
  • 범위 표현 (brace expansion)
    for x in {1..10}
  • 명령 결과
    for x in $(ls)
  • 글로브 패턴
    for x in *.txt

for 예제 1: 1부터 100까지 출력

#!/bin/bash

# {1..100} : 1부터 100까지 시퀀스를 생성
for a in {1..100}; do
    echo "hello world $a"
done
  • a가 1부터 100까지 바뀌면서, hello world 1, hello world 2 … 가 순차적으로 출력된다.

for 예제 2: 현재 디렉터리의 목록 출력

#!/bin/bash

# * : 현재 디렉터리의 모든 항목 (숨김 파일 제외)
for a in *; do
    echo "$a"
done
  • 현재 디렉터리 안에 있는 파일/폴더 이름을 하나씩 순회하며 출력한다.
  • 간단한 배포 스크립트, 로그 정리 스크립트 등에서 자주 쓰이는 패턴이다.

for 예제 3: 카운트 증가

#!/bin/bash

count=100

# {1..100} : 1부터 100까지 반복
for a in {1..100}; do
    # let 은 산술 연산용 내장 명령
    # 다른 표기: count=$((count + 1))
    let count=count+1
done

echo "count value is $count"
  • 초기값 count=100 에서 시작해, 100번 반복하면서 1씩 증가시킨다.
  • 반복이 끝난 후 출력되는 값은 200이 된다.
  • let, $(( ... )) 둘 다 정수 연산에 자주 사용되는 패턴이니 둘 다 익혀두면 좋다.

마치며

터미널에서 매번 손으로 치던 명령들을 .sh 파일로 묶어 두기만 해도 작업의 수고가 크게 줄어들것같다는걸 느낀 실습이였다 굿

profile
Eazy하게

1개의 댓글

comment-user-thumbnail
2025년 12월 11일

Shebang
뭔가 엄청난 이름이죠?
그녀가 터뜨린다
체인소맨 레제와 같다고 할 수 있겠습니다
저는 참고로 체인소맨을 정말좋아하는데요특히요시다라는문어의악마와계약한친구가있습니다이친구는등장때부터아주간지가나며문어의악마를다룬다는점에서크툴루신화를반영한다면정말강한데빌헌터라고할수있는데요최근화에서아주아쉽게(스포)되었습니다아주아쉽습니다…추모의시간을가집시다 모두묵념

답글 달기